Lines Matching +full:common +full:- +full:mode +full:- +full:channel

1 // SPDX-License-Identifier: GPL-2.0-or-later
19 #include "ncsi-pkt.h"
20 #include "ncsi-netlink.h"
46 h = (struct ncsi_rsp_pkt_hdr *)skb_network_header(nr->rsp); in ncsi_validate_rsp_pkt()
48 if (h->common.revision != NCSI_PKT_REVISION) { in ncsi_validate_rsp_pkt()
49 netdev_dbg(nr->ndp->ndev.dev, in ncsi_validate_rsp_pkt()
51 return -EINVAL; in ncsi_validate_rsp_pkt()
53 if (ntohs(h->common.length) != payload) { in ncsi_validate_rsp_pkt()
54 netdev_dbg(nr->ndp->ndev.dev, in ncsi_validate_rsp_pkt()
56 return -EINVAL; in ncsi_validate_rsp_pkt()
60 if (ntohs(h->code) != NCSI_PKT_RSP_C_COMPLETED || in ncsi_validate_rsp_pkt()
61 ntohs(h->reason) != NCSI_PKT_RSP_R_NO_ERROR) { in ncsi_validate_rsp_pkt()
62 netdev_dbg(nr->ndp->ndev.dev, in ncsi_validate_rsp_pkt()
64 ntohs(h->code), ntohs(h->reason)); in ncsi_validate_rsp_pkt()
65 return -EPERM; in ncsi_validate_rsp_pkt()
72 pchecksum = (__be32 *)((void *)(h + 1) + ALIGN(payload, 4) - 4); in ncsi_validate_rsp_pkt()
77 sizeof(*h) + payload - 4); in ncsi_validate_rsp_pkt()
80 netdev_dbg(nr->ndp->ndev.dev, in ncsi_validate_rsp_pkt()
83 return -EINVAL; in ncsi_validate_rsp_pkt()
92 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_cis()
97 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_cis()
98 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, &np, &nc); in ncsi_rsp_handler_cis()
100 if (ndp->flags & NCSI_DEV_PROBED) in ncsi_rsp_handler_cis()
101 return -ENXIO; in ncsi_rsp_handler_cis()
103 id = NCSI_CHANNEL_INDEX(rsp->rsp.common.channel); in ncsi_rsp_handler_cis()
107 return nc ? 0 : -ENODEV; in ncsi_rsp_handler_cis()
113 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_sp()
120 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_sp()
121 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_sp()
124 if (ndp->flags & NCSI_DEV_PROBED) in ncsi_rsp_handler_sp()
125 return -ENXIO; in ncsi_rsp_handler_sp()
127 id = NCSI_PACKAGE_INDEX(rsp->rsp.common.channel); in ncsi_rsp_handler_sp()
130 return -ENODEV; in ncsi_rsp_handler_sp()
139 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_dp()
145 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_dp()
146 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_dp()
149 return -ENODEV; in ncsi_rsp_handler_dp()
153 spin_lock_irqsave(&nc->lock, flags); in ncsi_rsp_handler_dp()
154 nc->state = NCSI_CHANNEL_INACTIVE; in ncsi_rsp_handler_dp()
155 spin_unlock_irqrestore(&nc->lock, flags); in ncsi_rsp_handler_dp()
164 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_ec()
168 /* Find the package and channel */ in ncsi_rsp_handler_ec()
169 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_ec()
170 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_ec()
173 return -ENODEV; in ncsi_rsp_handler_ec()
175 ncm = &nc->modes[NCSI_MODE_ENABLE]; in ncsi_rsp_handler_ec()
176 if (ncm->enable) in ncsi_rsp_handler_ec()
179 ncm->enable = 1; in ncsi_rsp_handler_ec()
186 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_dc()
195 /* Find the package and channel */ in ncsi_rsp_handler_dc()
196 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_dc()
197 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_dc()
200 return -ENODEV; in ncsi_rsp_handler_dc()
202 ncm = &nc->modes[NCSI_MODE_ENABLE]; in ncsi_rsp_handler_dc()
203 if (!ncm->enable) in ncsi_rsp_handler_dc()
206 ncm->enable = 0; in ncsi_rsp_handler_dc()
213 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_rc()
217 /* Find the package and channel */ in ncsi_rsp_handler_rc()
218 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_rc()
219 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_rc()
222 return -ENODEV; in ncsi_rsp_handler_rc()
224 /* Update state for the specified channel */ in ncsi_rsp_handler_rc()
225 spin_lock_irqsave(&nc->lock, flags); in ncsi_rsp_handler_rc()
226 nc->state = NCSI_CHANNEL_INACTIVE; in ncsi_rsp_handler_rc()
227 spin_unlock_irqrestore(&nc->lock, flags); in ncsi_rsp_handler_rc()
235 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_ecnt()
239 /* Find the package and channel */ in ncsi_rsp_handler_ecnt()
240 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_ecnt()
241 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_ecnt()
244 return -ENODEV; in ncsi_rsp_handler_ecnt()
246 ncm = &nc->modes[NCSI_MODE_TX_ENABLE]; in ncsi_rsp_handler_ecnt()
247 if (ncm->enable) in ncsi_rsp_handler_ecnt()
250 ncm->enable = 1; in ncsi_rsp_handler_ecnt()
257 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_dcnt()
261 /* Find the package and channel */ in ncsi_rsp_handler_dcnt()
262 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_dcnt()
263 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_dcnt()
266 return -ENODEV; in ncsi_rsp_handler_dcnt()
268 ncm = &nc->modes[NCSI_MODE_TX_ENABLE]; in ncsi_rsp_handler_dcnt()
269 if (!ncm->enable) in ncsi_rsp_handler_dcnt()
272 ncm->enable = 0; in ncsi_rsp_handler_dcnt()
280 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_ae()
284 /* Find the package and channel */ in ncsi_rsp_handler_ae()
285 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_ae()
286 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_ae()
289 return -ENODEV; in ncsi_rsp_handler_ae()
292 ncm = &nc->modes[NCSI_MODE_AEN]; in ncsi_rsp_handler_ae()
293 if (ncm->enable) in ncsi_rsp_handler_ae()
297 cmd = (struct ncsi_cmd_ae_pkt *)skb_network_header(nr->cmd); in ncsi_rsp_handler_ae()
298 ncm->enable = 1; in ncsi_rsp_handler_ae()
299 ncm->data[0] = cmd->mc_id; in ncsi_rsp_handler_ae()
300 ncm->data[1] = ntohl(cmd->mode); in ncsi_rsp_handler_ae()
309 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_sl()
313 /* Find the package and channel */ in ncsi_rsp_handler_sl()
314 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_sl()
315 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_sl()
318 return -ENODEV; in ncsi_rsp_handler_sl()
320 cmd = (struct ncsi_cmd_sl_pkt *)skb_network_header(nr->cmd); in ncsi_rsp_handler_sl()
321 ncm = &nc->modes[NCSI_MODE_LINK]; in ncsi_rsp_handler_sl()
322 ncm->data[0] = ntohl(cmd->mode); in ncsi_rsp_handler_sl()
323 ncm->data[1] = ntohl(cmd->oem_mode); in ncsi_rsp_handler_sl()
331 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_gls()
336 /* Find the package and channel */ in ncsi_rsp_handler_gls()
337 rsp = (struct ncsi_rsp_gls_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_gls()
338 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_gls()
341 return -ENODEV; in ncsi_rsp_handler_gls()
343 ncm = &nc->modes[NCSI_MODE_LINK]; in ncsi_rsp_handler_gls()
344 ncm->data[2] = ntohl(rsp->status); in ncsi_rsp_handler_gls()
345 ncm->data[3] = ntohl(rsp->other); in ncsi_rsp_handler_gls()
346 ncm->data[4] = ntohl(rsp->oem_status); in ncsi_rsp_handler_gls()
348 if (nr->flags & NCSI_REQ_FLAG_EVENT_DRIVEN) in ncsi_rsp_handler_gls()
351 /* Reset the channel monitor if it has been enabled */ in ncsi_rsp_handler_gls()
352 spin_lock_irqsave(&nc->lock, flags); in ncsi_rsp_handler_gls()
353 nc->monitor.state = NCSI_CHANNEL_MONITOR_START; in ncsi_rsp_handler_gls()
354 spin_unlock_irqrestore(&nc->lock, flags); in ncsi_rsp_handler_gls()
363 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_svf()
369 /* Find the package and channel */ in ncsi_rsp_handler_svf()
370 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_svf()
371 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_svf()
374 return -ENODEV; in ncsi_rsp_handler_svf()
376 cmd = (struct ncsi_cmd_svf_pkt *)skb_network_header(nr->cmd); in ncsi_rsp_handler_svf()
377 ncf = &nc->vlan_filter; in ncsi_rsp_handler_svf()
378 if (cmd->index == 0 || cmd->index > ncf->n_vids) in ncsi_rsp_handler_svf()
379 return -ERANGE; in ncsi_rsp_handler_svf()
382 spin_lock_irqsave(&nc->lock, flags); in ncsi_rsp_handler_svf()
383 bitmap = &ncf->bitmap; in ncsi_rsp_handler_svf()
384 if (!(cmd->enable & 0x1)) { in ncsi_rsp_handler_svf()
385 if (test_and_clear_bit(cmd->index - 1, bitmap)) in ncsi_rsp_handler_svf()
386 ncf->vids[cmd->index - 1] = 0; in ncsi_rsp_handler_svf()
388 set_bit(cmd->index - 1, bitmap); in ncsi_rsp_handler_svf()
389 ncf->vids[cmd->index - 1] = ntohs(cmd->vlan); in ncsi_rsp_handler_svf()
391 spin_unlock_irqrestore(&nc->lock, flags); in ncsi_rsp_handler_svf()
400 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_ev()
404 /* Find the package and channel */ in ncsi_rsp_handler_ev()
405 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_ev()
406 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_ev()
409 return -ENODEV; in ncsi_rsp_handler_ev()
411 /* Check if VLAN mode has been enabled */ in ncsi_rsp_handler_ev()
412 ncm = &nc->modes[NCSI_MODE_VLAN]; in ncsi_rsp_handler_ev()
413 if (ncm->enable) in ncsi_rsp_handler_ev()
416 /* Update to VLAN mode */ in ncsi_rsp_handler_ev()
417 cmd = (struct ncsi_cmd_ev_pkt *)skb_network_header(nr->cmd); in ncsi_rsp_handler_ev()
418 ncm->enable = 1; in ncsi_rsp_handler_ev()
419 ncm->data[0] = ntohl((__force __be32)cmd->mode); in ncsi_rsp_handler_ev()
427 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_dv()
431 /* Find the package and channel */ in ncsi_rsp_handler_dv()
432 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_dv()
433 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_dv()
436 return -ENODEV; in ncsi_rsp_handler_dv()
438 /* Check if VLAN mode has been enabled */ in ncsi_rsp_handler_dv()
439 ncm = &nc->modes[NCSI_MODE_VLAN]; in ncsi_rsp_handler_dv()
440 if (!ncm->enable) in ncsi_rsp_handler_dv()
443 /* Update to VLAN mode */ in ncsi_rsp_handler_dv()
444 ncm->enable = 0; in ncsi_rsp_handler_dv()
452 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_sma()
461 /* Find the package and channel */ in ncsi_rsp_handler_sma()
462 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_sma()
463 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_sma()
466 return -ENODEV; in ncsi_rsp_handler_sma()
471 cmd = (struct ncsi_cmd_sma_pkt *)skb_network_header(nr->cmd); in ncsi_rsp_handler_sma()
472 enabled = cmd->at_e & 0x1; in ncsi_rsp_handler_sma()
473 ncf = &nc->mac_filter; in ncsi_rsp_handler_sma()
474 bitmap = &ncf->bitmap; in ncsi_rsp_handler_sma()
476 if (cmd->index == 0 || in ncsi_rsp_handler_sma()
477 cmd->index > ncf->n_uc + ncf->n_mc + ncf->n_mixed) in ncsi_rsp_handler_sma()
478 return -ERANGE; in ncsi_rsp_handler_sma()
480 index = (cmd->index - 1) * ETH_ALEN; in ncsi_rsp_handler_sma()
481 spin_lock_irqsave(&nc->lock, flags); in ncsi_rsp_handler_sma()
483 set_bit(cmd->index - 1, bitmap); in ncsi_rsp_handler_sma()
484 memcpy(&ncf->addrs[index], cmd->mac, ETH_ALEN); in ncsi_rsp_handler_sma()
486 clear_bit(cmd->index - 1, bitmap); in ncsi_rsp_handler_sma()
487 eth_zero_addr(&ncf->addrs[index]); in ncsi_rsp_handler_sma()
489 spin_unlock_irqrestore(&nc->lock, flags); in ncsi_rsp_handler_sma()
498 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_ebf()
502 /* Find the package and channel */ in ncsi_rsp_handler_ebf()
503 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_ebf()
504 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, NULL, &nc); in ncsi_rsp_handler_ebf()
506 return -ENODEV; in ncsi_rsp_handler_ebf()
509 ncm = &nc->modes[NCSI_MODE_BC]; in ncsi_rsp_handler_ebf()
510 if (ncm->enable) in ncsi_rsp_handler_ebf()
513 /* Update to broadcast filter mode */ in ncsi_rsp_handler_ebf()
514 cmd = (struct ncsi_cmd_ebf_pkt *)skb_network_header(nr->cmd); in ncsi_rsp_handler_ebf()
515 ncm->enable = 1; in ncsi_rsp_handler_ebf()
516 ncm->data[0] = ntohl(cmd->mode); in ncsi_rsp_handler_ebf()
524 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_dbf()
528 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_dbf()
529 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_dbf()
532 return -ENODEV; in ncsi_rsp_handler_dbf()
535 ncm = &nc->modes[NCSI_MODE_BC]; in ncsi_rsp_handler_dbf()
536 if (!ncm->enable) in ncsi_rsp_handler_dbf()
539 /* Update to broadcast filter mode */ in ncsi_rsp_handler_dbf()
540 ncm->enable = 0; in ncsi_rsp_handler_dbf()
541 ncm->data[0] = 0; in ncsi_rsp_handler_dbf()
550 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_egmf()
554 /* Find the channel */ in ncsi_rsp_handler_egmf()
555 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_egmf()
556 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_egmf()
559 return -ENODEV; in ncsi_rsp_handler_egmf()
562 ncm = &nc->modes[NCSI_MODE_MC]; in ncsi_rsp_handler_egmf()
563 if (ncm->enable) in ncsi_rsp_handler_egmf()
566 /* Update to multicast filter mode */ in ncsi_rsp_handler_egmf()
567 cmd = (struct ncsi_cmd_egmf_pkt *)skb_network_header(nr->cmd); in ncsi_rsp_handler_egmf()
568 ncm->enable = 1; in ncsi_rsp_handler_egmf()
569 ncm->data[0] = ntohl(cmd->mode); in ncsi_rsp_handler_egmf()
577 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_dgmf()
581 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_dgmf()
582 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_dgmf()
585 return -ENODEV; in ncsi_rsp_handler_dgmf()
588 ncm = &nc->modes[NCSI_MODE_MC]; in ncsi_rsp_handler_dgmf()
589 if (!ncm->enable) in ncsi_rsp_handler_dgmf()
592 /* Update to multicast filter mode */ in ncsi_rsp_handler_dgmf()
593 ncm->enable = 0; in ncsi_rsp_handler_dgmf()
594 ncm->data[0] = 0; in ncsi_rsp_handler_dgmf()
603 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_snfc()
607 /* Find the channel */ in ncsi_rsp_handler_snfc()
608 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_snfc()
609 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_snfc()
612 return -ENODEV; in ncsi_rsp_handler_snfc()
615 ncm = &nc->modes[NCSI_MODE_FC]; in ncsi_rsp_handler_snfc()
616 if (ncm->enable) in ncsi_rsp_handler_snfc()
619 /* Update to flow control mode */ in ncsi_rsp_handler_snfc()
620 cmd = (struct ncsi_cmd_snfc_pkt *)skb_network_header(nr->cmd); in ncsi_rsp_handler_snfc()
621 ncm->enable = 1; in ncsi_rsp_handler_snfc()
622 ncm->data[0] = cmd->mode; in ncsi_rsp_handler_snfc()
630 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_oem_gma()
631 struct sockaddr *saddr = &ndp->pending_mac; in ncsi_rsp_handler_oem_gma()
632 struct net_device *ndev = ndp->ndev.dev; in ncsi_rsp_handler_oem_gma()
637 rsp = (struct ncsi_rsp_oem_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_oem_gma()
639 ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE; in ncsi_rsp_handler_oem_gma()
647 saddr->sa_family = ndev->type; in ncsi_rsp_handler_oem_gma()
648 memcpy(saddr->sa_data, &rsp->data[mac_addr_off], ETH_ALEN); in ncsi_rsp_handler_oem_gma()
650 eth_addr_inc((u8 *)saddr->sa_data); in ncsi_rsp_handler_oem_gma()
651 if (!is_valid_ether_addr((const u8 *)saddr->sa_data)) in ncsi_rsp_handler_oem_gma()
652 return -ENXIO; in ncsi_rsp_handler_oem_gma()
655 ndp->gma_flag = 1; in ncsi_rsp_handler_oem_gma()
667 rsp = (struct ncsi_rsp_oem_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_oem_mlx()
668 mlx = (struct ncsi_rsp_oem_mlx_pkt *)(rsp->data); in ncsi_rsp_handler_oem_mlx()
670 if (mlx->cmd == NCSI_OEM_MLX_CMD_GMA && in ncsi_rsp_handler_oem_mlx()
671 mlx->param == NCSI_OEM_MLX_CMD_GMA_PARAM) in ncsi_rsp_handler_oem_mlx()
683 rsp = (struct ncsi_rsp_oem_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_oem_bcm()
684 bcm = (struct ncsi_rsp_oem_bcm_pkt *)(rsp->data); in ncsi_rsp_handler_oem_bcm()
686 if (bcm->type == NCSI_OEM_BCM_CMD_GMA) in ncsi_rsp_handler_oem_bcm()
698 rsp = (struct ncsi_rsp_oem_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_oem_intel()
699 intel = (struct ncsi_rsp_oem_intel_pkt *)(rsp->data); in ncsi_rsp_handler_oem_intel()
701 if (intel->cmd == NCSI_OEM_INTEL_CMD_GMA) in ncsi_rsp_handler_oem_intel()
724 rsp = (struct ncsi_rsp_oem_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_oem()
725 mfr_id = ntohl(rsp->mfr_id); in ncsi_rsp_handler_oem()
740 netdev_err(nr->ndp->ndev.dev, "Received unrecognized OEM packet with MFR-ID (0x%x)\n", in ncsi_rsp_handler_oem()
742 return -ENOENT; in ncsi_rsp_handler_oem()
746 return nrh->handler(nr); in ncsi_rsp_handler_oem()
752 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_gvi()
757 /* Find the channel */ in ncsi_rsp_handler_gvi()
758 rsp = (struct ncsi_rsp_gvi_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_gvi()
759 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_gvi()
762 return -ENODEV; in ncsi_rsp_handler_gvi()
764 /* Update channel's version info in ncsi_rsp_handler_gvi()
769 * Alpha1 and alpha2 are ISO/IEC 8859-1 characters. in ncsi_rsp_handler_gvi()
771 ncv = &nc->version; in ncsi_rsp_handler_gvi()
772 ncv->major = decode_bcd_u8(rsp->major); in ncsi_rsp_handler_gvi()
773 ncv->minor = decode_bcd_u8(rsp->minor); in ncsi_rsp_handler_gvi()
774 ncv->update = decode_bcd_u8(rsp->update); in ncsi_rsp_handler_gvi()
775 ncv->alpha1 = rsp->alpha1; in ncsi_rsp_handler_gvi()
776 ncv->alpha2 = rsp->alpha2; in ncsi_rsp_handler_gvi()
777 memcpy(ncv->fw_name, rsp->fw_name, 12); in ncsi_rsp_handler_gvi()
778 ncv->fw_version = ntohl(rsp->fw_version); in ncsi_rsp_handler_gvi()
779 for (i = 0; i < ARRAY_SIZE(ncv->pci_ids); i++) in ncsi_rsp_handler_gvi()
780 ncv->pci_ids[i] = ntohs(rsp->pci_ids[i]); in ncsi_rsp_handler_gvi()
781 ncv->mf_id = ntohl(rsp->mf_id); in ncsi_rsp_handler_gvi()
789 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_gc()
794 /* Find the channel */ in ncsi_rsp_handler_gc()
795 rsp = (struct ncsi_rsp_gc_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_gc()
796 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_gc()
799 return -ENODEV; in ncsi_rsp_handler_gc()
801 /* Update channel's capabilities */ in ncsi_rsp_handler_gc()
802 nc->caps[NCSI_CAP_GENERIC].cap = ntohl(rsp->cap) & in ncsi_rsp_handler_gc()
804 nc->caps[NCSI_CAP_BC].cap = ntohl(rsp->bc_cap) & in ncsi_rsp_handler_gc()
806 nc->caps[NCSI_CAP_MC].cap = ntohl(rsp->mc_cap) & in ncsi_rsp_handler_gc()
808 nc->caps[NCSI_CAP_BUFFER].cap = ntohl(rsp->buf_cap); in ncsi_rsp_handler_gc()
809 nc->caps[NCSI_CAP_AEN].cap = ntohl(rsp->aen_cap) & in ncsi_rsp_handler_gc()
811 nc->caps[NCSI_CAP_VLAN].cap = rsp->vlan_mode & in ncsi_rsp_handler_gc()
814 size = (rsp->uc_cnt + rsp->mc_cnt + rsp->mixed_cnt) * ETH_ALEN; in ncsi_rsp_handler_gc()
815 nc->mac_filter.addrs = kzalloc(size, GFP_ATOMIC); in ncsi_rsp_handler_gc()
816 if (!nc->mac_filter.addrs) in ncsi_rsp_handler_gc()
817 return -ENOMEM; in ncsi_rsp_handler_gc()
818 nc->mac_filter.n_uc = rsp->uc_cnt; in ncsi_rsp_handler_gc()
819 nc->mac_filter.n_mc = rsp->mc_cnt; in ncsi_rsp_handler_gc()
820 nc->mac_filter.n_mixed = rsp->mixed_cnt; in ncsi_rsp_handler_gc()
822 nc->vlan_filter.vids = kcalloc(rsp->vlan_cnt, in ncsi_rsp_handler_gc()
823 sizeof(*nc->vlan_filter.vids), in ncsi_rsp_handler_gc()
825 if (!nc->vlan_filter.vids) in ncsi_rsp_handler_gc()
826 return -ENOMEM; in ncsi_rsp_handler_gc()
830 nc->vlan_filter.bitmap = U64_MAX; in ncsi_rsp_handler_gc()
831 nc->vlan_filter.n_vids = rsp->vlan_cnt; in ncsi_rsp_handler_gc()
832 np->ndp->channel_count = rsp->channel_cnt; in ncsi_rsp_handler_gc()
841 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_gp()
850 /* Find the channel */ in ncsi_rsp_handler_gp()
851 rsp = (struct ncsi_rsp_gp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_gp()
852 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_gp()
855 return -ENODEV; in ncsi_rsp_handler_gp()
858 if (ntohl(rsp->valid_modes) & 0x1) { /* BC filter mode */ in ncsi_rsp_handler_gp()
859 nc->modes[NCSI_MODE_BC].enable = 1; in ncsi_rsp_handler_gp()
860 nc->modes[NCSI_MODE_BC].data[0] = ntohl(rsp->bc_mode); in ncsi_rsp_handler_gp()
862 if (ntohl(rsp->valid_modes) & 0x2) /* Channel enabled */ in ncsi_rsp_handler_gp()
863 nc->modes[NCSI_MODE_ENABLE].enable = 1; in ncsi_rsp_handler_gp()
864 if (ntohl(rsp->valid_modes) & 0x4) /* Channel Tx enabled */ in ncsi_rsp_handler_gp()
865 nc->modes[NCSI_MODE_TX_ENABLE].enable = 1; in ncsi_rsp_handler_gp()
866 if (ntohl(rsp->valid_modes) & 0x8) /* MC filter mode */ in ncsi_rsp_handler_gp()
867 nc->modes[NCSI_MODE_MC].enable = 1; in ncsi_rsp_handler_gp()
870 nc->modes[NCSI_MODE_LINK].enable = 1; in ncsi_rsp_handler_gp()
871 nc->modes[NCSI_MODE_LINK].data[0] = ntohl(rsp->link_mode); in ncsi_rsp_handler_gp()
872 nc->modes[NCSI_MODE_VLAN].enable = 1; in ncsi_rsp_handler_gp()
873 nc->modes[NCSI_MODE_VLAN].data[0] = rsp->vlan_mode; in ncsi_rsp_handler_gp()
874 nc->modes[NCSI_MODE_FC].enable = 1; in ncsi_rsp_handler_gp()
875 nc->modes[NCSI_MODE_FC].data[0] = rsp->fc_mode; in ncsi_rsp_handler_gp()
876 nc->modes[NCSI_MODE_AEN].enable = 1; in ncsi_rsp_handler_gp()
877 nc->modes[NCSI_MODE_AEN].data[0] = ntohl(rsp->aen_mode); in ncsi_rsp_handler_gp()
881 enable = rsp->mac_enable; in ncsi_rsp_handler_gp()
882 ncmf = &nc->mac_filter; in ncsi_rsp_handler_gp()
883 spin_lock_irqsave(&nc->lock, flags); in ncsi_rsp_handler_gp()
884 bitmap = &ncmf->bitmap; in ncsi_rsp_handler_gp()
885 for (i = 0; i < rsp->mac_cnt; i++, pdata += 6) { in ncsi_rsp_handler_gp()
891 memcpy(&ncmf->addrs[i * ETH_ALEN], pdata, ETH_ALEN); in ncsi_rsp_handler_gp()
893 spin_unlock_irqrestore(&nc->lock, flags); in ncsi_rsp_handler_gp()
896 enable = ntohs(rsp->vlan_enable); in ncsi_rsp_handler_gp()
897 ncvf = &nc->vlan_filter; in ncsi_rsp_handler_gp()
898 bitmap = &ncvf->bitmap; in ncsi_rsp_handler_gp()
899 spin_lock_irqsave(&nc->lock, flags); in ncsi_rsp_handler_gp()
900 for (i = 0; i < rsp->vlan_cnt; i++, pdata += 2) { in ncsi_rsp_handler_gp()
906 ncvf->vids[i] = ntohs(*(__be16 *)pdata); in ncsi_rsp_handler_gp()
908 spin_unlock_irqrestore(&nc->lock, flags); in ncsi_rsp_handler_gp()
916 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_gcps()
920 /* Find the channel */ in ncsi_rsp_handler_gcps()
921 rsp = (struct ncsi_rsp_gcps_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_gcps()
922 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_gcps()
925 return -ENODEV; in ncsi_rsp_handler_gcps()
928 ncs = &nc->stats; in ncsi_rsp_handler_gcps()
929 ncs->hnc_cnt_hi = ntohl(rsp->cnt_hi); in ncsi_rsp_handler_gcps()
930 ncs->hnc_cnt_lo = ntohl(rsp->cnt_lo); in ncsi_rsp_handler_gcps()
931 ncs->hnc_rx_bytes = ntohl(rsp->rx_bytes); in ncsi_rsp_handler_gcps()
932 ncs->hnc_tx_bytes = ntohl(rsp->tx_bytes); in ncsi_rsp_handler_gcps()
933 ncs->hnc_rx_uc_pkts = ntohl(rsp->rx_uc_pkts); in ncsi_rsp_handler_gcps()
934 ncs->hnc_rx_mc_pkts = ntohl(rsp->rx_mc_pkts); in ncsi_rsp_handler_gcps()
935 ncs->hnc_rx_bc_pkts = ntohl(rsp->rx_bc_pkts); in ncsi_rsp_handler_gcps()
936 ncs->hnc_tx_uc_pkts = ntohl(rsp->tx_uc_pkts); in ncsi_rsp_handler_gcps()
937 ncs->hnc_tx_mc_pkts = ntohl(rsp->tx_mc_pkts); in ncsi_rsp_handler_gcps()
938 ncs->hnc_tx_bc_pkts = ntohl(rsp->tx_bc_pkts); in ncsi_rsp_handler_gcps()
939 ncs->hnc_fcs_err = ntohl(rsp->fcs_err); in ncsi_rsp_handler_gcps()
940 ncs->hnc_align_err = ntohl(rsp->align_err); in ncsi_rsp_handler_gcps()
941 ncs->hnc_false_carrier = ntohl(rsp->false_carrier); in ncsi_rsp_handler_gcps()
942 ncs->hnc_runt_pkts = ntohl(rsp->runt_pkts); in ncsi_rsp_handler_gcps()
943 ncs->hnc_jabber_pkts = ntohl(rsp->jabber_pkts); in ncsi_rsp_handler_gcps()
944 ncs->hnc_rx_pause_xon = ntohl(rsp->rx_pause_xon); in ncsi_rsp_handler_gcps()
945 ncs->hnc_rx_pause_xoff = ntohl(rsp->rx_pause_xoff); in ncsi_rsp_handler_gcps()
946 ncs->hnc_tx_pause_xon = ntohl(rsp->tx_pause_xon); in ncsi_rsp_handler_gcps()
947 ncs->hnc_tx_pause_xoff = ntohl(rsp->tx_pause_xoff); in ncsi_rsp_handler_gcps()
948 ncs->hnc_tx_s_collision = ntohl(rsp->tx_s_collision); in ncsi_rsp_handler_gcps()
949 ncs->hnc_tx_m_collision = ntohl(rsp->tx_m_collision); in ncsi_rsp_handler_gcps()
950 ncs->hnc_l_collision = ntohl(rsp->l_collision); in ncsi_rsp_handler_gcps()
951 ncs->hnc_e_collision = ntohl(rsp->e_collision); in ncsi_rsp_handler_gcps()
952 ncs->hnc_rx_ctl_frames = ntohl(rsp->rx_ctl_frames); in ncsi_rsp_handler_gcps()
953 ncs->hnc_rx_64_frames = ntohl(rsp->rx_64_frames); in ncsi_rsp_handler_gcps()
954 ncs->hnc_rx_127_frames = ntohl(rsp->rx_127_frames); in ncsi_rsp_handler_gcps()
955 ncs->hnc_rx_255_frames = ntohl(rsp->rx_255_frames); in ncsi_rsp_handler_gcps()
956 ncs->hnc_rx_511_frames = ntohl(rsp->rx_511_frames); in ncsi_rsp_handler_gcps()
957 ncs->hnc_rx_1023_frames = ntohl(rsp->rx_1023_frames); in ncsi_rsp_handler_gcps()
958 ncs->hnc_rx_1522_frames = ntohl(rsp->rx_1522_frames); in ncsi_rsp_handler_gcps()
959 ncs->hnc_rx_9022_frames = ntohl(rsp->rx_9022_frames); in ncsi_rsp_handler_gcps()
960 ncs->hnc_tx_64_frames = ntohl(rsp->tx_64_frames); in ncsi_rsp_handler_gcps()
961 ncs->hnc_tx_127_frames = ntohl(rsp->tx_127_frames); in ncsi_rsp_handler_gcps()
962 ncs->hnc_tx_255_frames = ntohl(rsp->tx_255_frames); in ncsi_rsp_handler_gcps()
963 ncs->hnc_tx_511_frames = ntohl(rsp->tx_511_frames); in ncsi_rsp_handler_gcps()
964 ncs->hnc_tx_1023_frames = ntohl(rsp->tx_1023_frames); in ncsi_rsp_handler_gcps()
965 ncs->hnc_tx_1522_frames = ntohl(rsp->tx_1522_frames); in ncsi_rsp_handler_gcps()
966 ncs->hnc_tx_9022_frames = ntohl(rsp->tx_9022_frames); in ncsi_rsp_handler_gcps()
967 ncs->hnc_rx_valid_bytes = ntohl(rsp->rx_valid_bytes); in ncsi_rsp_handler_gcps()
968 ncs->hnc_rx_runt_pkts = ntohl(rsp->rx_runt_pkts); in ncsi_rsp_handler_gcps()
969 ncs->hnc_rx_jabber_pkts = ntohl(rsp->rx_jabber_pkts); in ncsi_rsp_handler_gcps()
977 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_gns()
981 /* Find the channel */ in ncsi_rsp_handler_gns()
982 rsp = (struct ncsi_rsp_gns_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_gns()
983 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_gns()
986 return -ENODEV; in ncsi_rsp_handler_gns()
989 ncs = &nc->stats; in ncsi_rsp_handler_gns()
990 ncs->ncsi_rx_cmds = ntohl(rsp->rx_cmds); in ncsi_rsp_handler_gns()
991 ncs->ncsi_dropped_cmds = ntohl(rsp->dropped_cmds); in ncsi_rsp_handler_gns()
992 ncs->ncsi_cmd_type_errs = ntohl(rsp->cmd_type_errs); in ncsi_rsp_handler_gns()
993 ncs->ncsi_cmd_csum_errs = ntohl(rsp->cmd_csum_errs); in ncsi_rsp_handler_gns()
994 ncs->ncsi_rx_pkts = ntohl(rsp->rx_pkts); in ncsi_rsp_handler_gns()
995 ncs->ncsi_tx_pkts = ntohl(rsp->tx_pkts); in ncsi_rsp_handler_gns()
996 ncs->ncsi_tx_aen_pkts = ntohl(rsp->tx_aen_pkts); in ncsi_rsp_handler_gns()
1004 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_gnpts()
1008 /* Find the channel */ in ncsi_rsp_handler_gnpts()
1009 rsp = (struct ncsi_rsp_gnpts_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_gnpts()
1010 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_gnpts()
1013 return -ENODEV; in ncsi_rsp_handler_gnpts()
1016 ncs = &nc->stats; in ncsi_rsp_handler_gnpts()
1017 ncs->pt_tx_pkts = ntohl(rsp->tx_pkts); in ncsi_rsp_handler_gnpts()
1018 ncs->pt_tx_dropped = ntohl(rsp->tx_dropped); in ncsi_rsp_handler_gnpts()
1019 ncs->pt_tx_channel_err = ntohl(rsp->tx_channel_err); in ncsi_rsp_handler_gnpts()
1020 ncs->pt_tx_us_err = ntohl(rsp->tx_us_err); in ncsi_rsp_handler_gnpts()
1021 ncs->pt_rx_pkts = ntohl(rsp->rx_pkts); in ncsi_rsp_handler_gnpts()
1022 ncs->pt_rx_dropped = ntohl(rsp->rx_dropped); in ncsi_rsp_handler_gnpts()
1023 ncs->pt_rx_channel_err = ntohl(rsp->rx_channel_err); in ncsi_rsp_handler_gnpts()
1024 ncs->pt_rx_us_err = ntohl(rsp->rx_us_err); in ncsi_rsp_handler_gnpts()
1025 ncs->pt_rx_os_err = ntohl(rsp->rx_os_err); in ncsi_rsp_handler_gnpts()
1033 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_gps()
1037 rsp = (struct ncsi_rsp_gps_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_gps()
1038 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_gps()
1041 return -ENODEV; in ncsi_rsp_handler_gps()
1049 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_gpuuid()
1053 rsp = (struct ncsi_rsp_gpuuid_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_gpuuid()
1054 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_gpuuid()
1057 return -ENODEV; in ncsi_rsp_handler_gpuuid()
1059 memcpy(np->uuid, rsp->uuid, sizeof(rsp->uuid)); in ncsi_rsp_handler_gpuuid()
1071 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_netlink()
1078 rsp = (struct ncsi_rsp_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_netlink()
1079 ncsi_find_package_and_channel(ndp, rsp->rsp.common.channel, in ncsi_rsp_handler_netlink()
1082 return -ENODEV; in ncsi_rsp_handler_netlink()
1091 struct ncsi_dev_priv *ndp = nr->ndp; in ncsi_rsp_handler_gmcma()
1092 struct sockaddr *saddr = &ndp->pending_mac; in ncsi_rsp_handler_gmcma()
1093 struct net_device *ndev = ndp->ndev.dev; in ncsi_rsp_handler_gmcma()
1097 rsp = (struct ncsi_rsp_gmcma_pkt *)skb_network_header(nr->rsp); in ncsi_rsp_handler_gmcma()
1098 ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE; in ncsi_rsp_handler_gmcma()
1101 rsp->address_count); in ncsi_rsp_handler_gmcma()
1102 for (i = 0; i < rsp->address_count; i++) { in ncsi_rsp_handler_gmcma()
1104 i, rsp->addresses[i][0], rsp->addresses[i][1], in ncsi_rsp_handler_gmcma()
1105 rsp->addresses[i][2], rsp->addresses[i][3], in ncsi_rsp_handler_gmcma()
1106 rsp->addresses[i][4], rsp->addresses[i][5]); in ncsi_rsp_handler_gmcma()
1109 saddr->sa_family = ndev->type; in ncsi_rsp_handler_gmcma()
1110 for (i = 0; i < rsp->address_count; i++) { in ncsi_rsp_handler_gmcma()
1111 if (!is_valid_ether_addr(rsp->addresses[i])) { in ncsi_rsp_handler_gmcma()
1113 rsp->addresses[i]); in ncsi_rsp_handler_gmcma()
1116 memcpy(saddr->sa_data, rsp->addresses[i], ETH_ALEN); in ncsi_rsp_handler_gmcma()
1117 netdev_warn(ndev, "NCSI: Will set MAC address to %pM\n", saddr->sa_data); in ncsi_rsp_handler_gmcma()
1121 ndp->gma_flag = 1; in ncsi_rsp_handler_gmcma()
1152 { NCSI_PKT_RSP_GP, -1, ncsi_rsp_handler_gp },
1157 { NCSI_PKT_RSP_OEM, -1, ncsi_rsp_handler_oem },
1158 { NCSI_PKT_RSP_PLDM, -1, ncsi_rsp_handler_pldm },
1160 { NCSI_PKT_RSP_QPNPR, -1, ncsi_rsp_handler_pldm },
1161 { NCSI_PKT_RSP_SNPR, -1, ncsi_rsp_handler_pldm },
1162 { NCSI_PKT_RSP_GMCMA, -1, ncsi_rsp_handler_gmcma },
1180 return -ENODEV; in ncsi_rcv_rsp()
1184 if (hdr->type == NCSI_PKT_AEN) in ncsi_rcv_rsp()
1189 if (ncsi_rsp_handlers[i].type == hdr->type) { in ncsi_rcv_rsp()
1200 netdev_err(nd->dev, "Received unrecognized packet (0x%x)\n", in ncsi_rcv_rsp()
1201 hdr->type); in ncsi_rcv_rsp()
1202 return -ENOENT; in ncsi_rcv_rsp()
1206 spin_lock_irqsave(&ndp->lock, flags); in ncsi_rcv_rsp()
1207 nr = &ndp->requests[hdr->id]; in ncsi_rcv_rsp()
1208 if (!nr->used) { in ncsi_rcv_rsp()
1209 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_rcv_rsp()
1210 return -ENODEV; in ncsi_rcv_rsp()
1213 nr->rsp = skb; in ncsi_rcv_rsp()
1214 if (!nr->enabled) { in ncsi_rcv_rsp()
1215 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_rcv_rsp()
1216 ret = -ENOENT; in ncsi_rcv_rsp()
1221 spin_unlock_irqrestore(&ndp->lock, flags); in ncsi_rcv_rsp()
1222 payload = nrh->payload; in ncsi_rcv_rsp()
1224 payload = ntohs(hdr->length); in ncsi_rcv_rsp()
1227 netdev_warn(ndp->ndev.dev, in ncsi_rcv_rsp()
1229 hdr->type); in ncsi_rcv_rsp()
1231 if (nr->flags == NCSI_REQ_FLAG_NETLINK_DRIVEN) { in ncsi_rcv_rsp()
1232 if (ret == -EPERM) in ncsi_rcv_rsp()
1235 ncsi_send_netlink_err(ndp->ndev.dev, in ncsi_rcv_rsp()
1236 nr->snd_seq, in ncsi_rcv_rsp()
1237 nr->snd_portid, in ncsi_rcv_rsp()
1238 &nr->nlhdr, in ncsi_rcv_rsp()
1245 ret = nrh->handler(nr); in ncsi_rcv_rsp()
1247 netdev_err(ndp->ndev.dev, in ncsi_rcv_rsp()
1249 hdr->type, ret); in ncsi_rcv_rsp()
1252 if (nr->flags == NCSI_REQ_FLAG_NETLINK_DRIVEN) { in ncsi_rcv_rsp()
1255 netdev_err(ndp->ndev.dev, in ncsi_rcv_rsp()
1257 hdr->type, ret); in ncsi_rcv_rsp()