2 * Copyright Gavin Shan, IBM Corporation 2016.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
10 #include <linux/module.h>
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/netdevice.h>
14 #include <linux/skbuff.h>
17 #include <net/net_namespace.h>
23 static int ncsi_validate_rsp_pkt(struct ncsi_request
*nr
,
24 unsigned short payload
)
26 struct ncsi_rsp_pkt_hdr
*h
;
30 /* Check NCSI packet header. We don't need validate
31 * the packet type, which should have been checked
32 * before calling this function.
34 h
= (struct ncsi_rsp_pkt_hdr
*)skb_network_header(nr
->rsp
);
35 if (h
->common
.revision
!= NCSI_PKT_REVISION
)
37 if (ntohs(h
->common
.length
) != payload
)
40 /* Check on code and reason */
41 if (ntohs(h
->code
) != NCSI_PKT_RSP_C_COMPLETED
||
42 ntohs(h
->reason
) != NCSI_PKT_RSP_R_NO_ERROR
)
45 /* Validate checksum, which might be zeroes if the
46 * sender doesn't support checksum according to NCSI
49 pchecksum
= (__be32
*)((void *)(h
+ 1) + payload
- 4);
50 if (ntohl(*pchecksum
) == 0)
53 checksum
= ncsi_calculate_checksum((unsigned char *)h
,
54 sizeof(*h
) + payload
- 4);
55 if (*pchecksum
!= htonl(checksum
))
61 static int ncsi_rsp_handler_cis(struct ncsi_request
*nr
)
63 struct ncsi_rsp_pkt
*rsp
;
64 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
65 struct ncsi_package
*np
;
66 struct ncsi_channel
*nc
;
69 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
70 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
, &np
, &nc
);
72 if (ndp
->flags
& NCSI_DEV_PROBED
)
75 id
= NCSI_CHANNEL_INDEX(rsp
->rsp
.common
.channel
);
76 nc
= ncsi_add_channel(np
, id
);
79 return nc
? 0 : -ENODEV
;
82 static int ncsi_rsp_handler_sp(struct ncsi_request
*nr
)
84 struct ncsi_rsp_pkt
*rsp
;
85 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
86 struct ncsi_package
*np
;
89 /* Add the package if it's not existing. Otherwise,
90 * to change the state of its child channels.
92 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
93 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
96 if (ndp
->flags
& NCSI_DEV_PROBED
)
99 id
= NCSI_PACKAGE_INDEX(rsp
->rsp
.common
.channel
);
100 np
= ncsi_add_package(ndp
, id
);
108 static int ncsi_rsp_handler_dp(struct ncsi_request
*nr
)
110 struct ncsi_rsp_pkt
*rsp
;
111 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
112 struct ncsi_package
*np
;
113 struct ncsi_channel
*nc
;
116 /* Find the package */
117 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
118 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
123 /* Change state of all channels attached to the package */
124 NCSI_FOR_EACH_CHANNEL(np
, nc
) {
125 spin_lock_irqsave(&nc
->lock
, flags
);
126 nc
->state
= NCSI_CHANNEL_INACTIVE
;
127 spin_unlock_irqrestore(&nc
->lock
, flags
);
133 static int ncsi_rsp_handler_ec(struct ncsi_request
*nr
)
135 struct ncsi_rsp_pkt
*rsp
;
136 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
137 struct ncsi_channel
*nc
;
138 struct ncsi_channel_mode
*ncm
;
140 /* Find the package and channel */
141 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
142 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
147 ncm
= &nc
->modes
[NCSI_MODE_ENABLE
];
155 static int ncsi_rsp_handler_dc(struct ncsi_request
*nr
)
157 struct ncsi_rsp_pkt
*rsp
;
158 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
159 struct ncsi_channel
*nc
;
160 struct ncsi_channel_mode
*ncm
;
163 ret
= ncsi_validate_rsp_pkt(nr
, 4);
167 /* Find the package and channel */
168 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
169 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
174 ncm
= &nc
->modes
[NCSI_MODE_ENABLE
];
182 static int ncsi_rsp_handler_rc(struct ncsi_request
*nr
)
184 struct ncsi_rsp_pkt
*rsp
;
185 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
186 struct ncsi_channel
*nc
;
189 /* Find the package and channel */
190 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
191 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
196 /* Update state for the specified channel */
197 spin_lock_irqsave(&nc
->lock
, flags
);
198 nc
->state
= NCSI_CHANNEL_INACTIVE
;
199 spin_unlock_irqrestore(&nc
->lock
, flags
);
204 static int ncsi_rsp_handler_ecnt(struct ncsi_request
*nr
)
206 struct ncsi_rsp_pkt
*rsp
;
207 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
208 struct ncsi_channel
*nc
;
209 struct ncsi_channel_mode
*ncm
;
211 /* Find the package and channel */
212 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
213 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
218 ncm
= &nc
->modes
[NCSI_MODE_TX_ENABLE
];
226 static int ncsi_rsp_handler_dcnt(struct ncsi_request
*nr
)
228 struct ncsi_rsp_pkt
*rsp
;
229 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
230 struct ncsi_channel
*nc
;
231 struct ncsi_channel_mode
*ncm
;
233 /* Find the package and channel */
234 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
235 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
240 ncm
= &nc
->modes
[NCSI_MODE_TX_ENABLE
];
248 static int ncsi_rsp_handler_ae(struct ncsi_request
*nr
)
250 struct ncsi_cmd_ae_pkt
*cmd
;
251 struct ncsi_rsp_pkt
*rsp
;
252 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
253 struct ncsi_channel
*nc
;
254 struct ncsi_channel_mode
*ncm
;
256 /* Find the package and channel */
257 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
258 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
263 /* Check if the AEN has been enabled */
264 ncm
= &nc
->modes
[NCSI_MODE_AEN
];
268 /* Update to AEN configuration */
269 cmd
= (struct ncsi_cmd_ae_pkt
*)skb_network_header(nr
->cmd
);
271 ncm
->data
[0] = cmd
->mc_id
;
272 ncm
->data
[1] = ntohl(cmd
->mode
);
277 static int ncsi_rsp_handler_sl(struct ncsi_request
*nr
)
279 struct ncsi_cmd_sl_pkt
*cmd
;
280 struct ncsi_rsp_pkt
*rsp
;
281 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
282 struct ncsi_channel
*nc
;
283 struct ncsi_channel_mode
*ncm
;
285 /* Find the package and channel */
286 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
287 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
292 cmd
= (struct ncsi_cmd_sl_pkt
*)skb_network_header(nr
->cmd
);
293 ncm
= &nc
->modes
[NCSI_MODE_LINK
];
294 ncm
->data
[0] = ntohl(cmd
->mode
);
295 ncm
->data
[1] = ntohl(cmd
->oem_mode
);
300 static int ncsi_rsp_handler_gls(struct ncsi_request
*nr
)
302 struct ncsi_rsp_gls_pkt
*rsp
;
303 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
304 struct ncsi_channel
*nc
;
305 struct ncsi_channel_mode
*ncm
;
308 /* Find the package and channel */
309 rsp
= (struct ncsi_rsp_gls_pkt
*)skb_network_header(nr
->rsp
);
310 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
315 ncm
= &nc
->modes
[NCSI_MODE_LINK
];
316 ncm
->data
[2] = ntohl(rsp
->status
);
317 ncm
->data
[3] = ntohl(rsp
->other
);
318 ncm
->data
[4] = ntohl(rsp
->oem_status
);
320 if (nr
->flags
& NCSI_REQ_FLAG_EVENT_DRIVEN
)
323 /* Reset the channel monitor if it has been enabled */
324 spin_lock_irqsave(&nc
->lock
, flags
);
325 nc
->monitor
.state
= NCSI_CHANNEL_MONITOR_START
;
326 spin_unlock_irqrestore(&nc
->lock
, flags
);
331 static int ncsi_rsp_handler_svf(struct ncsi_request
*nr
)
333 struct ncsi_cmd_svf_pkt
*cmd
;
334 struct ncsi_rsp_pkt
*rsp
;
335 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
336 struct ncsi_channel
*nc
;
337 struct ncsi_channel_filter
*ncf
;
341 /* Find the package and channel */
342 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
343 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
348 cmd
= (struct ncsi_cmd_svf_pkt
*)skb_network_header(nr
->cmd
);
349 ncf
= nc
->filters
[NCSI_FILTER_VLAN
];
352 if (cmd
->index
>= ncf
->total
)
355 /* Add or remove the VLAN filter */
356 if (!(cmd
->enable
& 0x1)) {
357 ret
= ncsi_remove_filter(nc
, NCSI_FILTER_VLAN
, cmd
->index
);
359 vlan
= ntohs(cmd
->vlan
);
360 ret
= ncsi_add_filter(nc
, NCSI_FILTER_VLAN
, &vlan
);
366 static int ncsi_rsp_handler_ev(struct ncsi_request
*nr
)
368 struct ncsi_cmd_ev_pkt
*cmd
;
369 struct ncsi_rsp_pkt
*rsp
;
370 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
371 struct ncsi_channel
*nc
;
372 struct ncsi_channel_mode
*ncm
;
374 /* Find the package and channel */
375 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
376 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
381 /* Check if VLAN mode has been enabled */
382 ncm
= &nc
->modes
[NCSI_MODE_VLAN
];
386 /* Update to VLAN mode */
387 cmd
= (struct ncsi_cmd_ev_pkt
*)skb_network_header(nr
->cmd
);
389 ncm
->data
[0] = ntohl(cmd
->mode
);
394 static int ncsi_rsp_handler_dv(struct ncsi_request
*nr
)
396 struct ncsi_rsp_pkt
*rsp
;
397 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
398 struct ncsi_channel
*nc
;
399 struct ncsi_channel_mode
*ncm
;
401 /* Find the package and channel */
402 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
403 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
408 /* Check if VLAN mode has been enabled */
409 ncm
= &nc
->modes
[NCSI_MODE_VLAN
];
413 /* Update to VLAN mode */
418 static int ncsi_rsp_handler_sma(struct ncsi_request
*nr
)
420 struct ncsi_cmd_sma_pkt
*cmd
;
421 struct ncsi_rsp_pkt
*rsp
;
422 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
423 struct ncsi_channel
*nc
;
424 struct ncsi_channel_filter
*ncf
;
427 /* Find the package and channel */
428 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
429 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
434 /* According to NCSI spec 1.01, the mixed filter table
435 * isn't supported yet.
437 cmd
= (struct ncsi_cmd_sma_pkt
*)skb_network_header(nr
->cmd
);
438 switch (cmd
->at_e
>> 5) {
439 case 0x0: /* UC address */
440 ncf
= nc
->filters
[NCSI_FILTER_UC
];
442 case 0x1: /* MC address */
443 ncf
= nc
->filters
[NCSI_FILTER_MC
];
449 /* Sanity check on the filter */
452 else if (cmd
->index
>= ncf
->total
)
455 bitmap
= &ncf
->bitmap
;
456 if (cmd
->at_e
& 0x1) {
457 if (test_and_set_bit(cmd
->index
, bitmap
))
459 memcpy(ncf
->data
+ 6 * cmd
->index
, cmd
->mac
, 6);
461 if (!test_and_clear_bit(cmd
->index
, bitmap
))
464 memset(ncf
->data
+ 6 * cmd
->index
, 0, 6);
470 static int ncsi_rsp_handler_ebf(struct ncsi_request
*nr
)
472 struct ncsi_cmd_ebf_pkt
*cmd
;
473 struct ncsi_rsp_pkt
*rsp
;
474 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
475 struct ncsi_channel
*nc
;
476 struct ncsi_channel_mode
*ncm
;
478 /* Find the package and channel */
479 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
480 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
, NULL
, &nc
);
484 /* Check if broadcast filter has been enabled */
485 ncm
= &nc
->modes
[NCSI_MODE_BC
];
489 /* Update to broadcast filter mode */
490 cmd
= (struct ncsi_cmd_ebf_pkt
*)skb_network_header(nr
->cmd
);
492 ncm
->data
[0] = ntohl(cmd
->mode
);
497 static int ncsi_rsp_handler_dbf(struct ncsi_request
*nr
)
499 struct ncsi_rsp_pkt
*rsp
;
500 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
501 struct ncsi_channel
*nc
;
502 struct ncsi_channel_mode
*ncm
;
504 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
505 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
510 /* Check if broadcast filter isn't enabled */
511 ncm
= &nc
->modes
[NCSI_MODE_BC
];
515 /* Update to broadcast filter mode */
522 static int ncsi_rsp_handler_egmf(struct ncsi_request
*nr
)
524 struct ncsi_cmd_egmf_pkt
*cmd
;
525 struct ncsi_rsp_pkt
*rsp
;
526 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
527 struct ncsi_channel
*nc
;
528 struct ncsi_channel_mode
*ncm
;
530 /* Find the channel */
531 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
532 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
537 /* Check if multicast filter has been enabled */
538 ncm
= &nc
->modes
[NCSI_MODE_MC
];
542 /* Update to multicast filter mode */
543 cmd
= (struct ncsi_cmd_egmf_pkt
*)skb_network_header(nr
->cmd
);
545 ncm
->data
[0] = ntohl(cmd
->mode
);
550 static int ncsi_rsp_handler_dgmf(struct ncsi_request
*nr
)
552 struct ncsi_rsp_pkt
*rsp
;
553 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
554 struct ncsi_channel
*nc
;
555 struct ncsi_channel_mode
*ncm
;
557 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
558 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
563 /* Check if multicast filter has been enabled */
564 ncm
= &nc
->modes
[NCSI_MODE_MC
];
568 /* Update to multicast filter mode */
575 static int ncsi_rsp_handler_snfc(struct ncsi_request
*nr
)
577 struct ncsi_cmd_snfc_pkt
*cmd
;
578 struct ncsi_rsp_pkt
*rsp
;
579 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
580 struct ncsi_channel
*nc
;
581 struct ncsi_channel_mode
*ncm
;
583 /* Find the channel */
584 rsp
= (struct ncsi_rsp_pkt
*)skb_network_header(nr
->rsp
);
585 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
590 /* Check if flow control has been enabled */
591 ncm
= &nc
->modes
[NCSI_MODE_FC
];
595 /* Update to flow control mode */
596 cmd
= (struct ncsi_cmd_snfc_pkt
*)skb_network_header(nr
->cmd
);
598 ncm
->data
[0] = cmd
->mode
;
603 static int ncsi_rsp_handler_gvi(struct ncsi_request
*nr
)
605 struct ncsi_rsp_gvi_pkt
*rsp
;
606 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
607 struct ncsi_channel
*nc
;
608 struct ncsi_channel_version
*ncv
;
611 /* Find the channel */
612 rsp
= (struct ncsi_rsp_gvi_pkt
*)skb_network_header(nr
->rsp
);
613 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
618 /* Update to channel's version info */
620 ncv
->version
= ntohl(rsp
->ncsi_version
);
621 ncv
->alpha2
= rsp
->alpha2
;
622 memcpy(ncv
->fw_name
, rsp
->fw_name
, 12);
623 ncv
->fw_version
= ntohl(rsp
->fw_version
);
624 for (i
= 0; i
< ARRAY_SIZE(ncv
->pci_ids
); i
++)
625 ncv
->pci_ids
[i
] = ntohs(rsp
->pci_ids
[i
]);
626 ncv
->mf_id
= ntohl(rsp
->mf_id
);
631 static int ncsi_rsp_handler_gc(struct ncsi_request
*nr
)
633 struct ncsi_rsp_gc_pkt
*rsp
;
634 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
635 struct ncsi_channel
*nc
;
636 struct ncsi_channel_filter
*ncf
;
637 size_t size
, entry_size
;
640 /* Find the channel */
641 rsp
= (struct ncsi_rsp_gc_pkt
*)skb_network_header(nr
->rsp
);
642 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
647 /* Update channel's capabilities */
648 nc
->caps
[NCSI_CAP_GENERIC
].cap
= ntohl(rsp
->cap
) &
649 NCSI_CAP_GENERIC_MASK
;
650 nc
->caps
[NCSI_CAP_BC
].cap
= ntohl(rsp
->bc_cap
) &
652 nc
->caps
[NCSI_CAP_MC
].cap
= ntohl(rsp
->mc_cap
) &
654 nc
->caps
[NCSI_CAP_BUFFER
].cap
= ntohl(rsp
->buf_cap
);
655 nc
->caps
[NCSI_CAP_AEN
].cap
= ntohl(rsp
->aen_cap
) &
657 nc
->caps
[NCSI_CAP_VLAN
].cap
= rsp
->vlan_mode
&
661 for (i
= 0; i
< NCSI_FILTER_MAX
; i
++) {
663 case NCSI_FILTER_VLAN
:
667 case NCSI_FILTER_MIXED
:
668 cnt
= rsp
->mixed_cnt
;
683 if (!cnt
|| nc
->filters
[i
])
686 size
= sizeof(*ncf
) + cnt
* entry_size
;
687 ncf
= kzalloc(size
, GFP_ATOMIC
);
689 pr_warn("%s: Cannot alloc filter table (%d)\n",
697 nc
->filters
[i
] = ncf
;
703 static int ncsi_rsp_handler_gp(struct ncsi_request
*nr
)
705 struct ncsi_rsp_gp_pkt
*rsp
;
706 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
707 struct ncsi_channel
*nc
;
708 unsigned short enable
, vlan
;
709 unsigned char *pdata
;
712 /* Find the channel */
713 rsp
= (struct ncsi_rsp_gp_pkt
*)skb_network_header(nr
->rsp
);
714 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
719 /* Modes with explicit enabled indications */
720 if (ntohl(rsp
->valid_modes
) & 0x1) { /* BC filter mode */
721 nc
->modes
[NCSI_MODE_BC
].enable
= 1;
722 nc
->modes
[NCSI_MODE_BC
].data
[0] = ntohl(rsp
->bc_mode
);
724 if (ntohl(rsp
->valid_modes
) & 0x2) /* Channel enabled */
725 nc
->modes
[NCSI_MODE_ENABLE
].enable
= 1;
726 if (ntohl(rsp
->valid_modes
) & 0x4) /* Channel Tx enabled */
727 nc
->modes
[NCSI_MODE_TX_ENABLE
].enable
= 1;
728 if (ntohl(rsp
->valid_modes
) & 0x8) /* MC filter mode */
729 nc
->modes
[NCSI_MODE_MC
].enable
= 1;
731 /* Modes without explicit enabled indications */
732 nc
->modes
[NCSI_MODE_LINK
].enable
= 1;
733 nc
->modes
[NCSI_MODE_LINK
].data
[0] = ntohl(rsp
->link_mode
);
734 nc
->modes
[NCSI_MODE_VLAN
].enable
= 1;
735 nc
->modes
[NCSI_MODE_VLAN
].data
[0] = rsp
->vlan_mode
;
736 nc
->modes
[NCSI_MODE_FC
].enable
= 1;
737 nc
->modes
[NCSI_MODE_FC
].data
[0] = rsp
->fc_mode
;
738 nc
->modes
[NCSI_MODE_AEN
].enable
= 1;
739 nc
->modes
[NCSI_MODE_AEN
].data
[0] = ntohl(rsp
->aen_mode
);
741 /* MAC addresses filter table */
742 pdata
= (unsigned char *)rsp
+ 48;
743 enable
= rsp
->mac_enable
;
744 for (i
= 0; i
< rsp
->mac_cnt
; i
++, pdata
+= 6) {
745 if (i
>= (nc
->filters
[NCSI_FILTER_UC
]->total
+
746 nc
->filters
[NCSI_FILTER_MC
]->total
))
747 table
= NCSI_FILTER_MIXED
;
748 else if (i
>= nc
->filters
[NCSI_FILTER_UC
]->total
)
749 table
= NCSI_FILTER_MC
;
751 table
= NCSI_FILTER_UC
;
753 if (!(enable
& (0x1 << i
)))
756 if (ncsi_find_filter(nc
, table
, pdata
) >= 0)
759 ncsi_add_filter(nc
, table
, pdata
);
762 /* VLAN filter table */
763 enable
= ntohs(rsp
->vlan_enable
);
764 for (i
= 0; i
< rsp
->vlan_cnt
; i
++, pdata
+= 2) {
765 if (!(enable
& (0x1 << i
)))
768 vlan
= ntohs(*(__be16
*)pdata
);
769 if (ncsi_find_filter(nc
, NCSI_FILTER_VLAN
, &vlan
) >= 0)
772 ncsi_add_filter(nc
, NCSI_FILTER_VLAN
, &vlan
);
778 static int ncsi_rsp_handler_gcps(struct ncsi_request
*nr
)
780 struct ncsi_rsp_gcps_pkt
*rsp
;
781 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
782 struct ncsi_channel
*nc
;
783 struct ncsi_channel_stats
*ncs
;
785 /* Find the channel */
786 rsp
= (struct ncsi_rsp_gcps_pkt
*)skb_network_header(nr
->rsp
);
787 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
792 /* Update HNC's statistics */
794 ncs
->hnc_cnt_hi
= ntohl(rsp
->cnt_hi
);
795 ncs
->hnc_cnt_lo
= ntohl(rsp
->cnt_lo
);
796 ncs
->hnc_rx_bytes
= ntohl(rsp
->rx_bytes
);
797 ncs
->hnc_tx_bytes
= ntohl(rsp
->tx_bytes
);
798 ncs
->hnc_rx_uc_pkts
= ntohl(rsp
->rx_uc_pkts
);
799 ncs
->hnc_rx_mc_pkts
= ntohl(rsp
->rx_mc_pkts
);
800 ncs
->hnc_rx_bc_pkts
= ntohl(rsp
->rx_bc_pkts
);
801 ncs
->hnc_tx_uc_pkts
= ntohl(rsp
->tx_uc_pkts
);
802 ncs
->hnc_tx_mc_pkts
= ntohl(rsp
->tx_mc_pkts
);
803 ncs
->hnc_tx_bc_pkts
= ntohl(rsp
->tx_bc_pkts
);
804 ncs
->hnc_fcs_err
= ntohl(rsp
->fcs_err
);
805 ncs
->hnc_align_err
= ntohl(rsp
->align_err
);
806 ncs
->hnc_false_carrier
= ntohl(rsp
->false_carrier
);
807 ncs
->hnc_runt_pkts
= ntohl(rsp
->runt_pkts
);
808 ncs
->hnc_jabber_pkts
= ntohl(rsp
->jabber_pkts
);
809 ncs
->hnc_rx_pause_xon
= ntohl(rsp
->rx_pause_xon
);
810 ncs
->hnc_rx_pause_xoff
= ntohl(rsp
->rx_pause_xoff
);
811 ncs
->hnc_tx_pause_xon
= ntohl(rsp
->tx_pause_xon
);
812 ncs
->hnc_tx_pause_xoff
= ntohl(rsp
->tx_pause_xoff
);
813 ncs
->hnc_tx_s_collision
= ntohl(rsp
->tx_s_collision
);
814 ncs
->hnc_tx_m_collision
= ntohl(rsp
->tx_m_collision
);
815 ncs
->hnc_l_collision
= ntohl(rsp
->l_collision
);
816 ncs
->hnc_e_collision
= ntohl(rsp
->e_collision
);
817 ncs
->hnc_rx_ctl_frames
= ntohl(rsp
->rx_ctl_frames
);
818 ncs
->hnc_rx_64_frames
= ntohl(rsp
->rx_64_frames
);
819 ncs
->hnc_rx_127_frames
= ntohl(rsp
->rx_127_frames
);
820 ncs
->hnc_rx_255_frames
= ntohl(rsp
->rx_255_frames
);
821 ncs
->hnc_rx_511_frames
= ntohl(rsp
->rx_511_frames
);
822 ncs
->hnc_rx_1023_frames
= ntohl(rsp
->rx_1023_frames
);
823 ncs
->hnc_rx_1522_frames
= ntohl(rsp
->rx_1522_frames
);
824 ncs
->hnc_rx_9022_frames
= ntohl(rsp
->rx_9022_frames
);
825 ncs
->hnc_tx_64_frames
= ntohl(rsp
->tx_64_frames
);
826 ncs
->hnc_tx_127_frames
= ntohl(rsp
->tx_127_frames
);
827 ncs
->hnc_tx_255_frames
= ntohl(rsp
->tx_255_frames
);
828 ncs
->hnc_tx_511_frames
= ntohl(rsp
->tx_511_frames
);
829 ncs
->hnc_tx_1023_frames
= ntohl(rsp
->tx_1023_frames
);
830 ncs
->hnc_tx_1522_frames
= ntohl(rsp
->tx_1522_frames
);
831 ncs
->hnc_tx_9022_frames
= ntohl(rsp
->tx_9022_frames
);
832 ncs
->hnc_rx_valid_bytes
= ntohl(rsp
->rx_valid_bytes
);
833 ncs
->hnc_rx_runt_pkts
= ntohl(rsp
->rx_runt_pkts
);
834 ncs
->hnc_rx_jabber_pkts
= ntohl(rsp
->rx_jabber_pkts
);
839 static int ncsi_rsp_handler_gns(struct ncsi_request
*nr
)
841 struct ncsi_rsp_gns_pkt
*rsp
;
842 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
843 struct ncsi_channel
*nc
;
844 struct ncsi_channel_stats
*ncs
;
846 /* Find the channel */
847 rsp
= (struct ncsi_rsp_gns_pkt
*)skb_network_header(nr
->rsp
);
848 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
853 /* Update HNC's statistics */
855 ncs
->ncsi_rx_cmds
= ntohl(rsp
->rx_cmds
);
856 ncs
->ncsi_dropped_cmds
= ntohl(rsp
->dropped_cmds
);
857 ncs
->ncsi_cmd_type_errs
= ntohl(rsp
->cmd_type_errs
);
858 ncs
->ncsi_cmd_csum_errs
= ntohl(rsp
->cmd_csum_errs
);
859 ncs
->ncsi_rx_pkts
= ntohl(rsp
->rx_pkts
);
860 ncs
->ncsi_tx_pkts
= ntohl(rsp
->tx_pkts
);
861 ncs
->ncsi_tx_aen_pkts
= ntohl(rsp
->tx_aen_pkts
);
866 static int ncsi_rsp_handler_gnpts(struct ncsi_request
*nr
)
868 struct ncsi_rsp_gnpts_pkt
*rsp
;
869 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
870 struct ncsi_channel
*nc
;
871 struct ncsi_channel_stats
*ncs
;
873 /* Find the channel */
874 rsp
= (struct ncsi_rsp_gnpts_pkt
*)skb_network_header(nr
->rsp
);
875 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
880 /* Update HNC's statistics */
882 ncs
->pt_tx_pkts
= ntohl(rsp
->tx_pkts
);
883 ncs
->pt_tx_dropped
= ntohl(rsp
->tx_dropped
);
884 ncs
->pt_tx_channel_err
= ntohl(rsp
->tx_channel_err
);
885 ncs
->pt_tx_us_err
= ntohl(rsp
->tx_us_err
);
886 ncs
->pt_rx_pkts
= ntohl(rsp
->rx_pkts
);
887 ncs
->pt_rx_dropped
= ntohl(rsp
->rx_dropped
);
888 ncs
->pt_rx_channel_err
= ntohl(rsp
->rx_channel_err
);
889 ncs
->pt_rx_us_err
= ntohl(rsp
->rx_us_err
);
890 ncs
->pt_rx_os_err
= ntohl(rsp
->rx_os_err
);
895 static int ncsi_rsp_handler_gps(struct ncsi_request
*nr
)
897 struct ncsi_rsp_gps_pkt
*rsp
;
898 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
899 struct ncsi_package
*np
;
901 /* Find the package */
902 rsp
= (struct ncsi_rsp_gps_pkt
*)skb_network_header(nr
->rsp
);
903 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
911 static int ncsi_rsp_handler_gpuuid(struct ncsi_request
*nr
)
913 struct ncsi_rsp_gpuuid_pkt
*rsp
;
914 struct ncsi_dev_priv
*ndp
= nr
->ndp
;
915 struct ncsi_package
*np
;
917 /* Find the package */
918 rsp
= (struct ncsi_rsp_gpuuid_pkt
*)skb_network_header(nr
->rsp
);
919 ncsi_find_package_and_channel(ndp
, rsp
->rsp
.common
.channel
,
924 memcpy(np
->uuid
, rsp
->uuid
, sizeof(rsp
->uuid
));
929 static struct ncsi_rsp_handler
{
932 int (*handler
)(struct ncsi_request
*nr
);
933 } ncsi_rsp_handlers
[] = {
934 { NCSI_PKT_RSP_CIS
, 4, ncsi_rsp_handler_cis
},
935 { NCSI_PKT_RSP_SP
, 4, ncsi_rsp_handler_sp
},
936 { NCSI_PKT_RSP_DP
, 4, ncsi_rsp_handler_dp
},
937 { NCSI_PKT_RSP_EC
, 4, ncsi_rsp_handler_ec
},
938 { NCSI_PKT_RSP_DC
, 4, ncsi_rsp_handler_dc
},
939 { NCSI_PKT_RSP_RC
, 4, ncsi_rsp_handler_rc
},
940 { NCSI_PKT_RSP_ECNT
, 4, ncsi_rsp_handler_ecnt
},
941 { NCSI_PKT_RSP_DCNT
, 4, ncsi_rsp_handler_dcnt
},
942 { NCSI_PKT_RSP_AE
, 4, ncsi_rsp_handler_ae
},
943 { NCSI_PKT_RSP_SL
, 4, ncsi_rsp_handler_sl
},
944 { NCSI_PKT_RSP_GLS
, 16, ncsi_rsp_handler_gls
},
945 { NCSI_PKT_RSP_SVF
, 4, ncsi_rsp_handler_svf
},
946 { NCSI_PKT_RSP_EV
, 4, ncsi_rsp_handler_ev
},
947 { NCSI_PKT_RSP_DV
, 4, ncsi_rsp_handler_dv
},
948 { NCSI_PKT_RSP_SMA
, 4, ncsi_rsp_handler_sma
},
949 { NCSI_PKT_RSP_EBF
, 4, ncsi_rsp_handler_ebf
},
950 { NCSI_PKT_RSP_DBF
, 4, ncsi_rsp_handler_dbf
},
951 { NCSI_PKT_RSP_EGMF
, 4, ncsi_rsp_handler_egmf
},
952 { NCSI_PKT_RSP_DGMF
, 4, ncsi_rsp_handler_dgmf
},
953 { NCSI_PKT_RSP_SNFC
, 4, ncsi_rsp_handler_snfc
},
954 { NCSI_PKT_RSP_GVI
, 36, ncsi_rsp_handler_gvi
},
955 { NCSI_PKT_RSP_GC
, 32, ncsi_rsp_handler_gc
},
956 { NCSI_PKT_RSP_GP
, -1, ncsi_rsp_handler_gp
},
957 { NCSI_PKT_RSP_GCPS
, 172, ncsi_rsp_handler_gcps
},
958 { NCSI_PKT_RSP_GNS
, 172, ncsi_rsp_handler_gns
},
959 { NCSI_PKT_RSP_GNPTS
, 172, ncsi_rsp_handler_gnpts
},
960 { NCSI_PKT_RSP_GPS
, 8, ncsi_rsp_handler_gps
},
961 { NCSI_PKT_RSP_OEM
, 0, NULL
},
962 { NCSI_PKT_RSP_PLDM
, 0, NULL
},
963 { NCSI_PKT_RSP_GPUUID
, 20, ncsi_rsp_handler_gpuuid
}
966 int ncsi_rcv_rsp(struct sk_buff
*skb
, struct net_device
*dev
,
967 struct packet_type
*pt
, struct net_device
*orig_dev
)
969 struct ncsi_rsp_handler
*nrh
= NULL
;
971 struct ncsi_dev_priv
*ndp
;
972 struct ncsi_request
*nr
;
973 struct ncsi_pkt_hdr
*hdr
;
977 /* Find the NCSI device */
978 nd
= ncsi_find_dev(dev
);
979 ndp
= nd
? TO_NCSI_DEV_PRIV(nd
) : NULL
;
983 /* Check if it is AEN packet */
984 hdr
= (struct ncsi_pkt_hdr
*)skb_network_header(skb
);
985 if (hdr
->type
== NCSI_PKT_AEN
)
986 return ncsi_aen_handler(ndp
, skb
);
988 /* Find the handler */
989 for (i
= 0; i
< ARRAY_SIZE(ncsi_rsp_handlers
); i
++) {
990 if (ncsi_rsp_handlers
[i
].type
== hdr
->type
) {
991 if (ncsi_rsp_handlers
[i
].handler
)
992 nrh
= &ncsi_rsp_handlers
[i
];
1001 netdev_err(nd
->dev
, "Received unrecognized packet (0x%x)\n",
1006 /* Associate with the request */
1007 spin_lock_irqsave(&ndp
->lock
, flags
);
1008 nr
= &ndp
->requests
[hdr
->id
];
1010 spin_unlock_irqrestore(&ndp
->lock
, flags
);
1016 spin_unlock_irqrestore(&ndp
->lock
, flags
);
1021 /* Validate the packet */
1022 spin_unlock_irqrestore(&ndp
->lock
, flags
);
1023 payload
= nrh
->payload
;
1025 payload
= ntohs(hdr
->length
);
1026 ret
= ncsi_validate_rsp_pkt(nr
, payload
);
1030 /* Process the packet */
1031 ret
= nrh
->handler(nr
);
1033 ncsi_free_request(nr
);