diff options
| -rw-r--r-- | drivers/net/cxgb4/cxgb4.h | 15 | ||||
| -rw-r--r-- | drivers/net/cxgb4/cxgb4_main.c | 68 | ||||
| -rw-r--r-- | drivers/net/cxgb4/cxgb4_uld.h | 6 | ||||
| -rw-r--r-- | drivers/net/cxgb4/l2t.c | 34 | ||||
| -rw-r--r-- | drivers/net/cxgb4/l2t.h | 3 | ||||
| -rw-r--r-- | drivers/net/cxgb4/t4_hw.c | 332 |
6 files changed, 3 insertions, 455 deletions
diff --git a/drivers/net/cxgb4/cxgb4.h b/drivers/net/cxgb4/cxgb4.h index 3ece9f5069fa..eaa49e4119f1 100644 --- a/drivers/net/cxgb4/cxgb4.h +++ b/drivers/net/cxgb4/cxgb4.h | |||
| @@ -592,7 +592,6 @@ void t4_os_portmod_changed(const struct adapter *adap, int port_id); | |||
| 592 | void t4_os_link_changed(struct adapter *adap, int port_id, int link_stat); | 592 | void t4_os_link_changed(struct adapter *adap, int port_id, int link_stat); |
| 593 | 593 | ||
| 594 | void *t4_alloc_mem(size_t size); | 594 | void *t4_alloc_mem(size_t size); |
| 595 | void t4_free_mem(void *addr); | ||
| 596 | 595 | ||
| 597 | void t4_free_sge_resources(struct adapter *adap); | 596 | void t4_free_sge_resources(struct adapter *adap); |
| 598 | irq_handler_t t4_intr_handler(struct adapter *adap); | 597 | irq_handler_t t4_intr_handler(struct adapter *adap); |
| @@ -651,7 +650,6 @@ static inline int t4_wr_mbox_ns(struct adapter *adap, int mbox, const void *cmd, | |||
| 651 | 650 | ||
| 652 | void t4_intr_enable(struct adapter *adapter); | 651 | void t4_intr_enable(struct adapter *adapter); |
| 653 | void t4_intr_disable(struct adapter *adapter); | 652 | void t4_intr_disable(struct adapter *adapter); |
| 654 | void t4_intr_clear(struct adapter *adapter); | ||
| 655 | int t4_slow_intr_handler(struct adapter *adapter); | 653 | int t4_slow_intr_handler(struct adapter *adapter); |
| 656 | 654 | ||
| 657 | int t4_wait_dev_ready(struct adapter *adap); | 655 | int t4_wait_dev_ready(struct adapter *adap); |
| @@ -664,24 +662,16 @@ int t4_check_fw_version(struct adapter *adapter); | |||
| 664 | int t4_prep_adapter(struct adapter *adapter); | 662 | int t4_prep_adapter(struct adapter *adapter); |
| 665 | int t4_port_init(struct adapter *adap, int mbox, int pf, int vf); | 663 | int t4_port_init(struct adapter *adap, int mbox, int pf, int vf); |
| 666 | void t4_fatal_err(struct adapter *adapter); | 664 | void t4_fatal_err(struct adapter *adapter); |
| 667 | int t4_set_trace_filter(struct adapter *adapter, const struct trace_params *tp, | ||
| 668 | int filter_index, int enable); | ||
| 669 | void t4_get_trace_filter(struct adapter *adapter, struct trace_params *tp, | ||
| 670 | int filter_index, int *enabled); | ||
| 671 | int t4_config_rss_range(struct adapter *adapter, int mbox, unsigned int viid, | 665 | int t4_config_rss_range(struct adapter *adapter, int mbox, unsigned int viid, |
| 672 | int start, int n, const u16 *rspq, unsigned int nrspq); | 666 | int start, int n, const u16 *rspq, unsigned int nrspq); |
| 673 | int t4_config_glbl_rss(struct adapter *adapter, int mbox, unsigned int mode, | 667 | int t4_config_glbl_rss(struct adapter *adapter, int mbox, unsigned int mode, |
| 674 | unsigned int flags); | 668 | unsigned int flags); |
| 675 | int t4_read_rss(struct adapter *adapter, u16 *entries); | ||
| 676 | int t4_mc_read(struct adapter *adap, u32 addr, __be32 *data, u64 *parity); | 669 | int t4_mc_read(struct adapter *adap, u32 addr, __be32 *data, u64 *parity); |
| 677 | int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, | 670 | int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, |
| 678 | u64 *parity); | 671 | u64 *parity); |
| 679 | 672 | ||
| 680 | void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p); | 673 | void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p); |
| 681 | void t4_get_lb_stats(struct adapter *adap, int idx, struct lb_port_stats *p); | ||
| 682 | |||
| 683 | void t4_read_mtu_tbl(struct adapter *adap, u16 *mtus, u8 *mtu_log); | 674 | void t4_read_mtu_tbl(struct adapter *adap, u16 *mtus, u8 *mtu_log); |
| 684 | void t4_tp_get_err_stats(struct adapter *adap, struct tp_err_stats *st); | ||
| 685 | void t4_tp_get_tcp_stats(struct adapter *adap, struct tp_tcp_stats *v4, | 675 | void t4_tp_get_tcp_stats(struct adapter *adap, struct tp_tcp_stats *v4, |
| 686 | struct tp_tcp_stats *v6); | 676 | struct tp_tcp_stats *v6); |
| 687 | void t4_load_mtus(struct adapter *adap, const unsigned short *mtus, | 677 | void t4_load_mtus(struct adapter *adap, const unsigned short *mtus, |
| @@ -711,8 +701,6 @@ int t4_cfg_pfvf(struct adapter *adap, unsigned int mbox, unsigned int pf, | |||
| 711 | int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port, | 701 | int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port, |
| 712 | unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac, | 702 | unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac, |
| 713 | unsigned int *rss_size); | 703 | unsigned int *rss_size); |
| 714 | int t4_free_vi(struct adapter *adap, unsigned int mbox, unsigned int pf, | ||
| 715 | unsigned int vf, unsigned int viid); | ||
| 716 | int t4_set_rxmode(struct adapter *adap, unsigned int mbox, unsigned int viid, | 704 | int t4_set_rxmode(struct adapter *adap, unsigned int mbox, unsigned int viid, |
| 717 | int mtu, int promisc, int all_multi, int bcast, int vlanex, | 705 | int mtu, int promisc, int all_multi, int bcast, int vlanex, |
| 718 | bool sleep_ok); | 706 | bool sleep_ok); |
| @@ -731,9 +719,6 @@ int t4_mdio_rd(struct adapter *adap, unsigned int mbox, unsigned int phy_addr, | |||
| 731 | unsigned int mmd, unsigned int reg, u16 *valp); | 719 | unsigned int mmd, unsigned int reg, u16 *valp); |
| 732 | int t4_mdio_wr(struct adapter *adap, unsigned int mbox, unsigned int phy_addr, | 720 | int t4_mdio_wr(struct adapter *adap, unsigned int mbox, unsigned int phy_addr, |
| 733 | unsigned int mmd, unsigned int reg, u16 val); | 721 | unsigned int mmd, unsigned int reg, u16 val); |
| 734 | int t4_iq_start_stop(struct adapter *adap, unsigned int mbox, bool start, | ||
| 735 | unsigned int pf, unsigned int vf, unsigned int iqid, | ||
| 736 | unsigned int fl0id, unsigned int fl1id); | ||
| 737 | int t4_iq_free(struct adapter *adap, unsigned int mbox, unsigned int pf, | 722 | int t4_iq_free(struct adapter *adap, unsigned int mbox, unsigned int pf, |
| 738 | unsigned int vf, unsigned int iqtype, unsigned int iqid, | 723 | unsigned int vf, unsigned int iqtype, unsigned int iqid, |
| 739 | unsigned int fl0id, unsigned int fl1id); | 724 | unsigned int fl0id, unsigned int fl1id); |
diff --git a/drivers/net/cxgb4/cxgb4_main.c b/drivers/net/cxgb4/cxgb4_main.c index 22169a73b7f7..930bd075a43e 100644 --- a/drivers/net/cxgb4/cxgb4_main.c +++ b/drivers/net/cxgb4/cxgb4_main.c | |||
| @@ -880,7 +880,7 @@ void *t4_alloc_mem(size_t size) | |||
| 880 | /* | 880 | /* |
| 881 | * Free memory allocated through alloc_mem(). | 881 | * Free memory allocated through alloc_mem(). |
| 882 | */ | 882 | */ |
| 883 | void t4_free_mem(void *addr) | 883 | static void t4_free_mem(void *addr) |
| 884 | { | 884 | { |
| 885 | if (is_vmalloc_addr(addr)) | 885 | if (is_vmalloc_addr(addr)) |
| 886 | vfree(addr); | 886 | vfree(addr); |
| @@ -2206,8 +2206,8 @@ static void mk_tid_release(struct sk_buff *skb, unsigned int chan, | |||
| 2206 | * Queue a TID release request and if necessary schedule a work queue to | 2206 | * Queue a TID release request and if necessary schedule a work queue to |
| 2207 | * process it. | 2207 | * process it. |
| 2208 | */ | 2208 | */ |
| 2209 | void cxgb4_queue_tid_release(struct tid_info *t, unsigned int chan, | 2209 | static void cxgb4_queue_tid_release(struct tid_info *t, unsigned int chan, |
| 2210 | unsigned int tid) | 2210 | unsigned int tid) |
| 2211 | { | 2211 | { |
| 2212 | void **p = &t->tid_tab[tid]; | 2212 | void **p = &t->tid_tab[tid]; |
| 2213 | struct adapter *adap = container_of(t, struct adapter, tids); | 2213 | struct adapter *adap = container_of(t, struct adapter, tids); |
| @@ -2222,7 +2222,6 @@ void cxgb4_queue_tid_release(struct tid_info *t, unsigned int chan, | |||
| 2222 | } | 2222 | } |
| 2223 | spin_unlock_bh(&adap->tid_release_lock); | 2223 | spin_unlock_bh(&adap->tid_release_lock); |
| 2224 | } | 2224 | } |
| 2225 | EXPORT_SYMBOL(cxgb4_queue_tid_release); | ||
| 2226 | 2225 | ||
| 2227 | /* | 2226 | /* |
| 2228 | * Process the list of pending TID release requests. | 2227 | * Process the list of pending TID release requests. |
| @@ -2355,48 +2354,6 @@ int cxgb4_create_server(const struct net_device *dev, unsigned int stid, | |||
| 2355 | EXPORT_SYMBOL(cxgb4_create_server); | 2354 | EXPORT_SYMBOL(cxgb4_create_server); |
| 2356 | 2355 | ||
| 2357 | /** | 2356 | /** |
| 2358 | * cxgb4_create_server6 - create an IPv6 server | ||
| 2359 | * @dev: the device | ||
| 2360 | * @stid: the server TID | ||
| 2361 | * @sip: local IPv6 address to bind server to | ||
| 2362 | * @sport: the server's TCP port | ||
| 2363 | * @queue: queue to direct messages from this server to | ||
| 2364 | * | ||
| 2365 | * Create an IPv6 server for the given port and address. | ||
| 2366 | * Returns <0 on error and one of the %NET_XMIT_* values on success. | ||
| 2367 | */ | ||
| 2368 | int cxgb4_create_server6(const struct net_device *dev, unsigned int stid, | ||
| 2369 | const struct in6_addr *sip, __be16 sport, | ||
| 2370 | unsigned int queue) | ||
| 2371 | { | ||
| 2372 | unsigned int chan; | ||
| 2373 | struct sk_buff *skb; | ||
| 2374 | struct adapter *adap; | ||
| 2375 | struct cpl_pass_open_req6 *req; | ||
| 2376 | |||
| 2377 | skb = alloc_skb(sizeof(*req), GFP_KERNEL); | ||
| 2378 | if (!skb) | ||
| 2379 | return -ENOMEM; | ||
| 2380 | |||
| 2381 | adap = netdev2adap(dev); | ||
| 2382 | req = (struct cpl_pass_open_req6 *)__skb_put(skb, sizeof(*req)); | ||
| 2383 | INIT_TP_WR(req, 0); | ||
| 2384 | OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_PASS_OPEN_REQ6, stid)); | ||
| 2385 | req->local_port = sport; | ||
| 2386 | req->peer_port = htons(0); | ||
| 2387 | req->local_ip_hi = *(__be64 *)(sip->s6_addr); | ||
| 2388 | req->local_ip_lo = *(__be64 *)(sip->s6_addr + 8); | ||
| 2389 | req->peer_ip_hi = cpu_to_be64(0); | ||
| 2390 | req->peer_ip_lo = cpu_to_be64(0); | ||
| 2391 | chan = rxq_to_chan(&adap->sge, queue); | ||
| 2392 | req->opt0 = cpu_to_be64(TX_CHAN(chan)); | ||
| 2393 | req->opt1 = cpu_to_be64(CONN_POLICY_ASK | | ||
| 2394 | SYN_RSS_ENABLE | SYN_RSS_QUEUE(queue)); | ||
| 2395 | return t4_mgmt_tx(adap, skb); | ||
| 2396 | } | ||
| 2397 | EXPORT_SYMBOL(cxgb4_create_server6); | ||
| 2398 | |||
| 2399 | /** | ||
| 2400 | * cxgb4_best_mtu - find the entry in the MTU table closest to an MTU | 2357 | * cxgb4_best_mtu - find the entry in the MTU table closest to an MTU |
| 2401 | * @mtus: the HW MTU table | 2358 | * @mtus: the HW MTU table |
| 2402 | * @mtu: the target MTU | 2359 | * @mtu: the target MTU |
| @@ -2455,25 +2412,6 @@ unsigned int cxgb4_port_idx(const struct net_device *dev) | |||
| 2455 | } | 2412 | } |
| 2456 | EXPORT_SYMBOL(cxgb4_port_idx); | 2413 | EXPORT_SYMBOL(cxgb4_port_idx); |
| 2457 | 2414 | ||
| 2458 | /** | ||
| 2459 | * cxgb4_netdev_by_hwid - return the net device of a HW port | ||
| 2460 | * @pdev: identifies the adapter | ||
| 2461 | * @id: the HW port id | ||
| 2462 | * | ||
| 2463 | * Return the net device associated with the interface with the given HW | ||
| 2464 | * id. | ||
| 2465 | */ | ||
| 2466 | struct net_device *cxgb4_netdev_by_hwid(struct pci_dev *pdev, unsigned int id) | ||
| 2467 | { | ||
| 2468 | const struct adapter *adap = pci_get_drvdata(pdev); | ||
| 2469 | |||
| 2470 | if (!adap || id >= NCHAN) | ||
| 2471 | return NULL; | ||
| 2472 | id = adap->chan_map[id]; | ||
| 2473 | return id < MAX_NPORTS ? adap->port[id] : NULL; | ||
| 2474 | } | ||
| 2475 | EXPORT_SYMBOL(cxgb4_netdev_by_hwid); | ||
| 2476 | |||
| 2477 | void cxgb4_get_tcp_stats(struct pci_dev *pdev, struct tp_tcp_stats *v4, | 2415 | void cxgb4_get_tcp_stats(struct pci_dev *pdev, struct tp_tcp_stats *v4, |
| 2478 | struct tp_tcp_stats *v6) | 2416 | struct tp_tcp_stats *v6) |
| 2479 | { | 2417 | { |
diff --git a/drivers/net/cxgb4/cxgb4_uld.h b/drivers/net/cxgb4/cxgb4_uld.h index 85d74e751ce0..1b48c0170145 100644 --- a/drivers/net/cxgb4/cxgb4_uld.h +++ b/drivers/net/cxgb4/cxgb4_uld.h | |||
| @@ -139,16 +139,11 @@ int cxgb4_alloc_stid(struct tid_info *t, int family, void *data); | |||
| 139 | void cxgb4_free_atid(struct tid_info *t, unsigned int atid); | 139 | void cxgb4_free_atid(struct tid_info *t, unsigned int atid); |
| 140 | void cxgb4_free_stid(struct tid_info *t, unsigned int stid, int family); | 140 | void cxgb4_free_stid(struct tid_info *t, unsigned int stid, int family); |
| 141 | void cxgb4_remove_tid(struct tid_info *t, unsigned int qid, unsigned int tid); | 141 | void cxgb4_remove_tid(struct tid_info *t, unsigned int qid, unsigned int tid); |
| 142 | void cxgb4_queue_tid_release(struct tid_info *t, unsigned int chan, | ||
| 143 | unsigned int tid); | ||
| 144 | 142 | ||
| 145 | struct in6_addr; | 143 | struct in6_addr; |
| 146 | 144 | ||
| 147 | int cxgb4_create_server(const struct net_device *dev, unsigned int stid, | 145 | int cxgb4_create_server(const struct net_device *dev, unsigned int stid, |
| 148 | __be32 sip, __be16 sport, unsigned int queue); | 146 | __be32 sip, __be16 sport, unsigned int queue); |
| 149 | int cxgb4_create_server6(const struct net_device *dev, unsigned int stid, | ||
| 150 | const struct in6_addr *sip, __be16 sport, | ||
| 151 | unsigned int queue); | ||
| 152 | 147 | ||
| 153 | static inline void set_wr_txq(struct sk_buff *skb, int prio, int queue) | 148 | static inline void set_wr_txq(struct sk_buff *skb, int prio, int queue) |
| 154 | { | 149 | { |
| @@ -233,7 +228,6 @@ int cxgb4_ofld_send(struct net_device *dev, struct sk_buff *skb); | |||
| 233 | unsigned int cxgb4_port_chan(const struct net_device *dev); | 228 | unsigned int cxgb4_port_chan(const struct net_device *dev); |
| 234 | unsigned int cxgb4_port_viid(const struct net_device *dev); | 229 | unsigned int cxgb4_port_viid(const struct net_device *dev); |
| 235 | unsigned int cxgb4_port_idx(const struct net_device *dev); | 230 | unsigned int cxgb4_port_idx(const struct net_device *dev); |
| 236 | struct net_device *cxgb4_netdev_by_hwid(struct pci_dev *pdev, unsigned int id); | ||
| 237 | unsigned int cxgb4_best_mtu(const unsigned short *mtus, unsigned short mtu, | 231 | unsigned int cxgb4_best_mtu(const unsigned short *mtus, unsigned short mtu, |
| 238 | unsigned int *idx); | 232 | unsigned int *idx); |
| 239 | void cxgb4_get_tcp_stats(struct pci_dev *pdev, struct tp_tcp_stats *v4, | 233 | void cxgb4_get_tcp_stats(struct pci_dev *pdev, struct tp_tcp_stats *v4, |
diff --git a/drivers/net/cxgb4/l2t.c b/drivers/net/cxgb4/l2t.c index e8f0f55e9d08..a2d323c473f8 100644 --- a/drivers/net/cxgb4/l2t.c +++ b/drivers/net/cxgb4/l2t.c | |||
| @@ -481,40 +481,6 @@ void t4_l2t_update(struct adapter *adap, struct neighbour *neigh) | |||
| 481 | handle_failed_resolution(adap, arpq); | 481 | handle_failed_resolution(adap, arpq); |
| 482 | } | 482 | } |
| 483 | 483 | ||
| 484 | /* | ||
| 485 | * Allocate an L2T entry for use by a switching rule. Such entries need to be | ||
| 486 | * explicitly freed and while busy they are not on any hash chain, so normal | ||
| 487 | * address resolution updates do not see them. | ||
| 488 | */ | ||
| 489 | struct l2t_entry *t4_l2t_alloc_switching(struct l2t_data *d) | ||
| 490 | { | ||
| 491 | struct l2t_entry *e; | ||
| 492 | |||
| 493 | write_lock_bh(&d->lock); | ||
| 494 | e = alloc_l2e(d); | ||
| 495 | if (e) { | ||
| 496 | spin_lock(&e->lock); /* avoid race with t4_l2t_free */ | ||
| 497 | e->state = L2T_STATE_SWITCHING; | ||
| 498 | atomic_set(&e->refcnt, 1); | ||
| 499 | spin_unlock(&e->lock); | ||
| 500 | } | ||
| 501 | write_unlock_bh(&d->lock); | ||
| 502 | return e; | ||
| 503 | } | ||
| 504 | |||
| 505 | /* | ||
| 506 | * Sets/updates the contents of a switching L2T entry that has been allocated | ||
| 507 | * with an earlier call to @t4_l2t_alloc_switching. | ||
| 508 | */ | ||
| 509 | int t4_l2t_set_switching(struct adapter *adap, struct l2t_entry *e, u16 vlan, | ||
| 510 | u8 port, u8 *eth_addr) | ||
| 511 | { | ||
| 512 | e->vlan = vlan; | ||
| 513 | e->lport = port; | ||
| 514 | memcpy(e->dmac, eth_addr, ETH_ALEN); | ||
| 515 | return write_l2e(adap, e, 0); | ||
| 516 | } | ||
| 517 | |||
| 518 | struct l2t_data *t4_init_l2t(void) | 484 | struct l2t_data *t4_init_l2t(void) |
| 519 | { | 485 | { |
| 520 | int i; | 486 | int i; |
diff --git a/drivers/net/cxgb4/l2t.h b/drivers/net/cxgb4/l2t.h index 643f27ed3cf4..7bd8f42378ff 100644 --- a/drivers/net/cxgb4/l2t.h +++ b/drivers/net/cxgb4/l2t.h | |||
| @@ -100,9 +100,6 @@ struct l2t_entry *cxgb4_l2t_get(struct l2t_data *d, struct neighbour *neigh, | |||
| 100 | unsigned int priority); | 100 | unsigned int priority); |
| 101 | 101 | ||
| 102 | void t4_l2t_update(struct adapter *adap, struct neighbour *neigh); | 102 | void t4_l2t_update(struct adapter *adap, struct neighbour *neigh); |
| 103 | struct l2t_entry *t4_l2t_alloc_switching(struct l2t_data *d); | ||
| 104 | int t4_l2t_set_switching(struct adapter *adap, struct l2t_entry *e, u16 vlan, | ||
| 105 | u8 port, u8 *eth_addr); | ||
| 106 | struct l2t_data *t4_init_l2t(void); | 103 | struct l2t_data *t4_init_l2t(void); |
| 107 | void do_l2t_write_rpl(struct adapter *p, const struct cpl_l2t_write_rpl *rpl); | 104 | void do_l2t_write_rpl(struct adapter *p, const struct cpl_l2t_write_rpl *rpl); |
| 108 | 105 | ||
diff --git a/drivers/net/cxgb4/t4_hw.c b/drivers/net/cxgb4/t4_hw.c index 9e1a4b49b47a..bb813d94aea8 100644 --- a/drivers/net/cxgb4/t4_hw.c +++ b/drivers/net/cxgb4/t4_hw.c | |||
| @@ -120,30 +120,6 @@ static void t4_read_indirect(struct adapter *adap, unsigned int addr_reg, | |||
| 120 | } | 120 | } |
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | #if 0 | ||
| 124 | /** | ||
| 125 | * t4_write_indirect - write indirectly addressed registers | ||
| 126 | * @adap: the adapter | ||
| 127 | * @addr_reg: register holding the indirect addresses | ||
| 128 | * @data_reg: register holding the value for the indirect registers | ||
| 129 | * @vals: values to write | ||
| 130 | * @nregs: how many indirect registers to write | ||
| 131 | * @start_idx: address of first indirect register to write | ||
| 132 | * | ||
| 133 | * Writes a sequential block of registers that are accessed indirectly | ||
| 134 | * through an address/data register pair. | ||
| 135 | */ | ||
| 136 | static void t4_write_indirect(struct adapter *adap, unsigned int addr_reg, | ||
| 137 | unsigned int data_reg, const u32 *vals, | ||
| 138 | unsigned int nregs, unsigned int start_idx) | ||
| 139 | { | ||
| 140 | while (nregs--) { | ||
| 141 | t4_write_reg(adap, addr_reg, start_idx++); | ||
| 142 | t4_write_reg(adap, data_reg, *vals++); | ||
| 143 | } | ||
| 144 | } | ||
| 145 | #endif | ||
| 146 | |||
| 147 | /* | 123 | /* |
| 148 | * Get the reply to a mailbox command and store it in @rpl in big-endian order. | 124 | * Get the reply to a mailbox command and store it in @rpl in big-endian order. |
| 149 | */ | 125 | */ |
| @@ -1560,44 +1536,6 @@ void t4_intr_disable(struct adapter *adapter) | |||
| 1560 | } | 1536 | } |
| 1561 | 1537 | ||
| 1562 | /** | 1538 | /** |
| 1563 | * t4_intr_clear - clear all interrupts | ||
| 1564 | * @adapter: the adapter whose interrupts should be cleared | ||
| 1565 | * | ||
| 1566 | * Clears all interrupts. The caller must be a PCI function managing | ||
| 1567 | * global interrupts. | ||
| 1568 | */ | ||
| 1569 | void t4_intr_clear(struct adapter *adapter) | ||
| 1570 | { | ||
| 1571 | static const unsigned int cause_reg[] = { | ||
| 1572 | SGE_INT_CAUSE1, SGE_INT_CAUSE2, SGE_INT_CAUSE3, | ||
| 1573 | PCIE_CORE_UTL_SYSTEM_BUS_AGENT_STATUS, | ||
| 1574 | PCIE_CORE_UTL_PCI_EXPRESS_PORT_STATUS, | ||
| 1575 | PCIE_NONFAT_ERR, PCIE_INT_CAUSE, | ||
| 1576 | MC_INT_CAUSE, | ||
| 1577 | MA_INT_WRAP_STATUS, MA_PARITY_ERROR_STATUS, MA_INT_CAUSE, | ||
| 1578 | EDC_INT_CAUSE, EDC_REG(EDC_INT_CAUSE, 1), | ||
| 1579 | CIM_HOST_INT_CAUSE, CIM_HOST_UPACC_INT_CAUSE, | ||
| 1580 | MYPF_REG(CIM_PF_HOST_INT_CAUSE), | ||
| 1581 | TP_INT_CAUSE, | ||
| 1582 | ULP_RX_INT_CAUSE, ULP_TX_INT_CAUSE, | ||
| 1583 | PM_RX_INT_CAUSE, PM_TX_INT_CAUSE, | ||
| 1584 | MPS_RX_PERR_INT_CAUSE, | ||
| 1585 | CPL_INTR_CAUSE, | ||
| 1586 | MYPF_REG(PL_PF_INT_CAUSE), | ||
| 1587 | PL_PL_INT_CAUSE, | ||
| 1588 | LE_DB_INT_CAUSE, | ||
| 1589 | }; | ||
| 1590 | |||
| 1591 | unsigned int i; | ||
| 1592 | |||
| 1593 | for (i = 0; i < ARRAY_SIZE(cause_reg); ++i) | ||
| 1594 | t4_write_reg(adapter, cause_reg[i], 0xffffffff); | ||
| 1595 | |||
| 1596 | t4_write_reg(adapter, PL_INT_CAUSE, GLBL_INTR_MASK); | ||
| 1597 | (void) t4_read_reg(adapter, PL_INT_CAUSE); /* flush */ | ||
| 1598 | } | ||
| 1599 | |||
| 1600 | /** | ||
| 1601 | * hash_mac_addr - return the hash value of a MAC address | 1539 | * hash_mac_addr - return the hash value of a MAC address |
| 1602 | * @addr: the 48-bit Ethernet MAC address | 1540 | * @addr: the 48-bit Ethernet MAC address |
| 1603 | * | 1541 | * |
| @@ -1709,36 +1647,6 @@ int t4_config_glbl_rss(struct adapter *adapter, int mbox, unsigned int mode, | |||
| 1709 | return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL); | 1647 | return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL); |
| 1710 | } | 1648 | } |
| 1711 | 1649 | ||
| 1712 | /* Read an RSS table row */ | ||
| 1713 | static int rd_rss_row(struct adapter *adap, int row, u32 *val) | ||
| 1714 | { | ||
| 1715 | t4_write_reg(adap, TP_RSS_LKP_TABLE, 0xfff00000 | row); | ||
| 1716 | return t4_wait_op_done_val(adap, TP_RSS_LKP_TABLE, LKPTBLROWVLD, 1, | ||
| 1717 | 5, 0, val); | ||
| 1718 | } | ||
| 1719 | |||
| 1720 | /** | ||
| 1721 | * t4_read_rss - read the contents of the RSS mapping table | ||
| 1722 | * @adapter: the adapter | ||
| 1723 | * @map: holds the contents of the RSS mapping table | ||
| 1724 | * | ||
| 1725 | * Reads the contents of the RSS hash->queue mapping table. | ||
| 1726 | */ | ||
| 1727 | int t4_read_rss(struct adapter *adapter, u16 *map) | ||
| 1728 | { | ||
| 1729 | u32 val; | ||
| 1730 | int i, ret; | ||
| 1731 | |||
| 1732 | for (i = 0; i < RSS_NENTRIES / 2; ++i) { | ||
| 1733 | ret = rd_rss_row(adapter, i, &val); | ||
| 1734 | if (ret) | ||
| 1735 | return ret; | ||
| 1736 | *map++ = LKPTBLQUEUE0_GET(val); | ||
| 1737 | *map++ = LKPTBLQUEUE1_GET(val); | ||
| 1738 | } | ||
| 1739 | return 0; | ||
| 1740 | } | ||
| 1741 | |||
| 1742 | /** | 1650 | /** |
| 1743 | * t4_tp_get_tcp_stats - read TP's TCP MIB counters | 1651 | * t4_tp_get_tcp_stats - read TP's TCP MIB counters |
| 1744 | * @adap: the adapter | 1652 | * @adap: the adapter |
| @@ -1779,29 +1687,6 @@ void t4_tp_get_tcp_stats(struct adapter *adap, struct tp_tcp_stats *v4, | |||
| 1779 | } | 1687 | } |
| 1780 | 1688 | ||
| 1781 | /** | 1689 | /** |
| 1782 | * t4_tp_get_err_stats - read TP's error MIB counters | ||
| 1783 | * @adap: the adapter | ||
| 1784 | * @st: holds the counter values | ||
| 1785 | * | ||
| 1786 | * Returns the values of TP's error counters. | ||
| 1787 | */ | ||
| 1788 | void t4_tp_get_err_stats(struct adapter *adap, struct tp_err_stats *st) | ||
| 1789 | { | ||
| 1790 | t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->macInErrs, | ||
| 1791 | 12, TP_MIB_MAC_IN_ERR_0); | ||
| 1792 | t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->tnlCongDrops, | ||
| 1793 | 8, TP_MIB_TNL_CNG_DROP_0); | ||
| 1794 | t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->tnlTxDrops, | ||
| 1795 | 4, TP_MIB_TNL_DROP_0); | ||
| 1796 | t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->ofldVlanDrops, | ||
| 1797 | 4, TP_MIB_OFD_VLN_DROP_0); | ||
| 1798 | t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->tcp6InErrs, | ||
| 1799 | 4, TP_MIB_TCP_V6IN_ERR_0); | ||
| 1800 | t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, &st->ofldNoNeigh, | ||
| 1801 | 2, TP_MIB_OFD_ARP_DROP); | ||
| 1802 | } | ||
| 1803 | |||
| 1804 | /** | ||
| 1805 | * t4_read_mtu_tbl - returns the values in the HW path MTU table | 1690 | * t4_read_mtu_tbl - returns the values in the HW path MTU table |
| 1806 | * @adap: the adapter | 1691 | * @adap: the adapter |
| 1807 | * @mtus: where to store the MTU values | 1692 | * @mtus: where to store the MTU values |
| @@ -1916,122 +1801,6 @@ void t4_load_mtus(struct adapter *adap, const unsigned short *mtus, | |||
| 1916 | } | 1801 | } |
| 1917 | 1802 | ||
| 1918 | /** | 1803 | /** |
| 1919 | * t4_set_trace_filter - configure one of the tracing filters | ||
| 1920 | * @adap: the adapter | ||
| 1921 | * @tp: the desired trace filter parameters | ||
| 1922 | * @idx: which filter to configure | ||
| 1923 | * @enable: whether to enable or disable the filter | ||
| 1924 | * | ||
| 1925 | * Configures one of the tracing filters available in HW. If @enable is | ||
| 1926 | * %0 @tp is not examined and may be %NULL. | ||
| 1927 | */ | ||
| 1928 | int t4_set_trace_filter(struct adapter *adap, const struct trace_params *tp, | ||
| 1929 | int idx, int enable) | ||
| 1930 | { | ||
| 1931 | int i, ofst = idx * 4; | ||
| 1932 | u32 data_reg, mask_reg, cfg; | ||
| 1933 | u32 multitrc = TRCMULTIFILTER; | ||
| 1934 | |||
| 1935 | if (!enable) { | ||
| 1936 | t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + ofst, 0); | ||
| 1937 | goto out; | ||
| 1938 | } | ||
| 1939 | |||
| 1940 | if (tp->port > 11 || tp->invert > 1 || tp->skip_len > 0x1f || | ||
| 1941 | tp->skip_ofst > 0x1f || tp->min_len > 0x1ff || | ||
| 1942 | tp->snap_len > 9600 || (idx && tp->snap_len > 256)) | ||
| 1943 | return -EINVAL; | ||
| 1944 | |||
| 1945 | if (tp->snap_len > 256) { /* must be tracer 0 */ | ||
| 1946 | if ((t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + 4) | | ||
| 1947 | t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + 8) | | ||
| 1948 | t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + 12)) & TFEN) | ||
| 1949 | return -EINVAL; /* other tracers are enabled */ | ||
| 1950 | multitrc = 0; | ||
| 1951 | } else if (idx) { | ||
| 1952 | i = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B); | ||
| 1953 | if (TFCAPTUREMAX_GET(i) > 256 && | ||
| 1954 | (t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A) & TFEN)) | ||
| 1955 | return -EINVAL; | ||
| 1956 | } | ||
| 1957 | |||
| 1958 | /* stop the tracer we'll be changing */ | ||
| 1959 | t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + ofst, 0); | ||
| 1960 | |||
| 1961 | /* disable tracing globally if running in the wrong single/multi mode */ | ||
| 1962 | cfg = t4_read_reg(adap, MPS_TRC_CFG); | ||
| 1963 | if ((cfg & TRCEN) && multitrc != (cfg & TRCMULTIFILTER)) { | ||
| 1964 | t4_write_reg(adap, MPS_TRC_CFG, cfg ^ TRCEN); | ||
| 1965 | t4_read_reg(adap, MPS_TRC_CFG); /* flush */ | ||
| 1966 | msleep(1); | ||
| 1967 | if (!(t4_read_reg(adap, MPS_TRC_CFG) & TRCFIFOEMPTY)) | ||
| 1968 | return -ETIMEDOUT; | ||
| 1969 | } | ||
| 1970 | /* | ||
| 1971 | * At this point either the tracing is enabled and in the right mode or | ||
| 1972 | * disabled. | ||
| 1973 | */ | ||
| 1974 | |||
| 1975 | idx *= (MPS_TRC_FILTER1_MATCH - MPS_TRC_FILTER0_MATCH); | ||
| 1976 | data_reg = MPS_TRC_FILTER0_MATCH + idx; | ||
| 1977 | mask_reg = MPS_TRC_FILTER0_DONT_CARE + idx; | ||
| 1978 | |||
| 1979 | for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) { | ||
| 1980 | t4_write_reg(adap, data_reg, tp->data[i]); | ||
| 1981 | t4_write_reg(adap, mask_reg, ~tp->mask[i]); | ||
| 1982 | } | ||
| 1983 | t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B + ofst, | ||
| 1984 | TFCAPTUREMAX(tp->snap_len) | | ||
| 1985 | TFMINPKTSIZE(tp->min_len)); | ||
| 1986 | t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + ofst, | ||
| 1987 | TFOFFSET(tp->skip_ofst) | TFLENGTH(tp->skip_len) | | ||
| 1988 | TFPORT(tp->port) | TFEN | | ||
| 1989 | (tp->invert ? TFINVERTMATCH : 0)); | ||
| 1990 | |||
| 1991 | cfg &= ~TRCMULTIFILTER; | ||
| 1992 | t4_write_reg(adap, MPS_TRC_CFG, cfg | TRCEN | multitrc); | ||
| 1993 | out: t4_read_reg(adap, MPS_TRC_CFG); /* flush */ | ||
| 1994 | return 0; | ||
| 1995 | } | ||
| 1996 | |||
| 1997 | /** | ||
| 1998 | * t4_get_trace_filter - query one of the tracing filters | ||
| 1999 | * @adap: the adapter | ||
| 2000 | * @tp: the current trace filter parameters | ||
| 2001 | * @idx: which trace filter to query | ||
| 2002 | * @enabled: non-zero if the filter is enabled | ||
| 2003 | * | ||
| 2004 | * Returns the current settings of one of the HW tracing filters. | ||
| 2005 | */ | ||
| 2006 | void t4_get_trace_filter(struct adapter *adap, struct trace_params *tp, int idx, | ||
| 2007 | int *enabled) | ||
| 2008 | { | ||
| 2009 | u32 ctla, ctlb; | ||
| 2010 | int i, ofst = idx * 4; | ||
| 2011 | u32 data_reg, mask_reg; | ||
| 2012 | |||
| 2013 | ctla = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + ofst); | ||
| 2014 | ctlb = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B + ofst); | ||
| 2015 | |||
| 2016 | *enabled = !!(ctla & TFEN); | ||
| 2017 | tp->snap_len = TFCAPTUREMAX_GET(ctlb); | ||
| 2018 | tp->min_len = TFMINPKTSIZE_GET(ctlb); | ||
| 2019 | tp->skip_ofst = TFOFFSET_GET(ctla); | ||
| 2020 | tp->skip_len = TFLENGTH_GET(ctla); | ||
| 2021 | tp->invert = !!(ctla & TFINVERTMATCH); | ||
| 2022 | tp->port = TFPORT_GET(ctla); | ||
| 2023 | |||
| 2024 | ofst = (MPS_TRC_FILTER1_MATCH - MPS_TRC_FILTER0_MATCH) * idx; | ||
| 2025 | data_reg = MPS_TRC_FILTER0_MATCH + ofst; | ||
| 2026 | mask_reg = MPS_TRC_FILTER0_DONT_CARE + ofst; | ||
| 2027 | |||
| 2028 | for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) { | ||
| 2029 | tp->mask[i] = ~t4_read_reg(adap, mask_reg); | ||
| 2030 | tp->data[i] = t4_read_reg(adap, data_reg) & tp->mask[i]; | ||
| 2031 | } | ||
| 2032 | } | ||
| 2033 | |||
| 2034 | /** | ||
| 2035 | * get_mps_bg_map - return the buffer groups associated with a port | 1804 | * get_mps_bg_map - return the buffer groups associated with a port |
| 2036 | * @adap: the adapter | 1805 | * @adap: the adapter |
| 2037 | * @idx: the port index | 1806 | * @idx: the port index |
| @@ -2133,52 +1902,6 @@ void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p) | |||
| 2133 | } | 1902 | } |
| 2134 | 1903 | ||
| 2135 | /** | 1904 | /** |
| 2136 | * t4_get_lb_stats - collect loopback port statistics | ||
| 2137 | * @adap: the adapter | ||
| 2138 | * @idx: the loopback port index | ||
| 2139 | * @p: the stats structure to fill | ||
| 2140 | * | ||
| 2141 | * Return HW statistics for the given loopback port. | ||
| 2142 | */ | ||
| 2143 | void t4_get_lb_stats(struct adapter *adap, int idx, struct lb_port_stats *p) | ||
| 2144 | { | ||
| 2145 | u32 bgmap = get_mps_bg_map(adap, idx); | ||
| 2146 | |||
| 2147 | #define GET_STAT(name) \ | ||
| 2148 | t4_read_reg64(adap, PORT_REG(idx, MPS_PORT_STAT_LB_PORT_##name##_L)) | ||
| 2149 | #define GET_STAT_COM(name) t4_read_reg64(adap, MPS_STAT_##name##_L) | ||
| 2150 | |||
| 2151 | p->octets = GET_STAT(BYTES); | ||
| 2152 | p->frames = GET_STAT(FRAMES); | ||
| 2153 | p->bcast_frames = GET_STAT(BCAST); | ||
| 2154 | p->mcast_frames = GET_STAT(MCAST); | ||
| 2155 | p->ucast_frames = GET_STAT(UCAST); | ||
| 2156 | p->error_frames = GET_STAT(ERROR); | ||
| 2157 | |||
| 2158 | p->frames_64 = GET_STAT(64B); | ||
| 2159 | p->frames_65_127 = GET_STAT(65B_127B); | ||
| 2160 | p->frames_128_255 = GET_STAT(128B_255B); | ||
| 2161 | p->frames_256_511 = GET_STAT(256B_511B); | ||
| 2162 | p->frames_512_1023 = GET_STAT(512B_1023B); | ||
| 2163 | p->frames_1024_1518 = GET_STAT(1024B_1518B); | ||
| 2164 | p->frames_1519_max = GET_STAT(1519B_MAX); | ||
| 2165 | p->drop = t4_read_reg(adap, PORT_REG(idx, | ||
| 2166 | MPS_PORT_STAT_LB_PORT_DROP_FRAMES)); | ||
| 2167 | |||
| 2168 | p->ovflow0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_DROP_FRAME) : 0; | ||
| 2169 | p->ovflow1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_DROP_FRAME) : 0; | ||
| 2170 | p->ovflow2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_DROP_FRAME) : 0; | ||
| 2171 | p->ovflow3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_DROP_FRAME) : 0; | ||
| 2172 | p->trunc0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_TRUNC_FRAME) : 0; | ||
| 2173 | p->trunc1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_TRUNC_FRAME) : 0; | ||
| 2174 | p->trunc2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_TRUNC_FRAME) : 0; | ||
| 2175 | p->trunc3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_TRUNC_FRAME) : 0; | ||
| 2176 | |||
| 2177 | #undef GET_STAT | ||
| 2178 | #undef GET_STAT_COM | ||
| 2179 | } | ||
| 2180 | |||
| 2181 | /** | ||
| 2182 | * t4_wol_magic_enable - enable/disable magic packet WoL | 1905 | * t4_wol_magic_enable - enable/disable magic packet WoL |
| 2183 | * @adap: the adapter | 1906 | * @adap: the adapter |
| 2184 | * @port: the physical port index | 1907 | * @port: the physical port index |
| @@ -2584,30 +2307,6 @@ int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port, | |||
| 2584 | } | 2307 | } |
| 2585 | 2308 | ||
| 2586 | /** | 2309 | /** |
| 2587 | * t4_free_vi - free a virtual interface | ||
| 2588 | * @adap: the adapter | ||
| 2589 | * @mbox: mailbox to use for the FW command | ||
| 2590 | * @pf: the PF owning the VI | ||
| 2591 | * @vf: the VF owning the VI | ||
| 2592 | * @viid: virtual interface identifiler | ||
| 2593 | * | ||
| 2594 | * Free a previously allocated virtual interface. | ||
| 2595 | */ | ||
| 2596 | int t4_free_vi(struct adapter *adap, unsigned int mbox, unsigned int pf, | ||
| 2597 | unsigned int vf, unsigned int viid) | ||
| 2598 | { | ||
| 2599 | struct fw_vi_cmd c; | ||
| 2600 | |||
| 2601 | memset(&c, 0, sizeof(c)); | ||
| 2602 | c.op_to_vfn = htonl(FW_CMD_OP(FW_VI_CMD) | FW_CMD_REQUEST | | ||
| 2603 | FW_CMD_EXEC | FW_VI_CMD_PFN(pf) | | ||
| 2604 | FW_VI_CMD_VFN(vf)); | ||
| 2605 | c.alloc_to_len16 = htonl(FW_VI_CMD_FREE | FW_LEN16(c)); | ||
| 2606 | c.type_viid = htons(FW_VI_CMD_VIID(viid)); | ||
| 2607 | return t4_wr_mbox(adap, mbox, &c, sizeof(c), &c); | ||
| 2608 | } | ||
| 2609 | |||
| 2610 | /** | ||
| 2611 | * t4_set_rxmode - set Rx properties of a virtual interface | 2310 | * t4_set_rxmode - set Rx properties of a virtual interface |
| 2612 | * @adap: the adapter | 2311 | * @adap: the adapter |
| 2613 | * @mbox: mailbox to use for the FW command | 2312 | * @mbox: mailbox to use for the FW command |
| @@ -2833,37 +2532,6 @@ int t4_identify_port(struct adapter *adap, unsigned int mbox, unsigned int viid, | |||
| 2833 | } | 2532 | } |
| 2834 | 2533 | ||
| 2835 | /** | 2534 | /** |
| 2836 | * t4_iq_start_stop - enable/disable an ingress queue and its FLs | ||
| 2837 | * @adap: the adapter | ||
| 2838 | * @mbox: mailbox to use for the FW command | ||
| 2839 | * @start: %true to enable the queues, %false to disable them | ||
| 2840 | * @pf: the PF owning the queues | ||
| 2841 | * @vf: the VF owning the queues | ||
| 2842 | * @iqid: ingress queue id | ||
| 2843 | * @fl0id: FL0 queue id or 0xffff if no attached FL0 | ||
| 2844 | * @fl1id: FL1 queue id or 0xffff if no attached FL1 | ||
| 2845 | * | ||
| 2846 | * Starts or stops an ingress queue and its associated FLs, if any. | ||
| 2847 | */ | ||
| 2848 | int t4_iq_start_stop(struct adapter *adap, unsigned int mbox, bool start, | ||
| 2849 | unsigned int pf, unsigned int vf, unsigned int iqid, | ||
| 2850 | unsigned int fl0id, unsigned int fl1id) | ||
| 2851 | { | ||
| 2852 | struct fw_iq_cmd c; | ||
| 2853 | |||
| 2854 | memset(&c, 0, sizeof(c)); | ||
| 2855 | c.op_to_vfn = htonl(FW_CMD_OP(FW_IQ_CMD) | FW_CMD_REQUEST | | ||
| 2856 | FW_CMD_EXEC | FW_IQ_CMD_PFN(pf) | | ||
| 2857 | FW_IQ_CMD_VFN(vf)); | ||
| 2858 | c.alloc_to_len16 = htonl(FW_IQ_CMD_IQSTART(start) | | ||
| 2859 | FW_IQ_CMD_IQSTOP(!start) | FW_LEN16(c)); | ||
| 2860 | c.iqid = htons(iqid); | ||
| 2861 | c.fl0id = htons(fl0id); | ||
| 2862 | c.fl1id = htons(fl1id); | ||
| 2863 | return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); | ||
| 2864 | } | ||
| 2865 | |||
| 2866 | /** | ||
| 2867 | * t4_iq_free - free an ingress queue and its FLs | 2535 | * t4_iq_free - free an ingress queue and its FLs |
| 2868 | * @adap: the adapter | 2536 | * @adap: the adapter |
| 2869 | * @mbox: mailbox to use for the FW command | 2537 | * @mbox: mailbox to use for the FW command |
