diff options
-rw-r--r-- | drivers/net/vxge/vxge-main.c | 149 | ||||
-rw-r--r-- | drivers/net/vxge/vxge-main.h | 15 | ||||
-rw-r--r-- | drivers/net/vxge/vxge-traffic.c | 4 |
3 files changed, 39 insertions, 129 deletions
diff --git a/drivers/net/vxge/vxge-main.c b/drivers/net/vxge/vxge-main.c index 66d914c1ccb9..48f17321a663 100644 --- a/drivers/net/vxge/vxge-main.c +++ b/drivers/net/vxge/vxge-main.c | |||
@@ -87,7 +87,6 @@ static inline int is_vxge_card_up(struct vxgedev *vdev) | |||
87 | 87 | ||
88 | static inline void VXGE_COMPLETE_VPATH_TX(struct vxge_fifo *fifo) | 88 | static inline void VXGE_COMPLETE_VPATH_TX(struct vxge_fifo *fifo) |
89 | { | 89 | { |
90 | unsigned long flags = 0; | ||
91 | struct sk_buff **skb_ptr = NULL; | 90 | struct sk_buff **skb_ptr = NULL; |
92 | struct sk_buff **temp; | 91 | struct sk_buff **temp; |
93 | #define NR_SKB_COMPLETED 128 | 92 | #define NR_SKB_COMPLETED 128 |
@@ -98,15 +97,16 @@ static inline void VXGE_COMPLETE_VPATH_TX(struct vxge_fifo *fifo) | |||
98 | more = 0; | 97 | more = 0; |
99 | skb_ptr = completed; | 98 | skb_ptr = completed; |
100 | 99 | ||
101 | if (spin_trylock_irqsave(&fifo->tx_lock, flags)) { | 100 | if (__netif_tx_trylock(fifo->txq)) { |
102 | vxge_hw_vpath_poll_tx(fifo->handle, &skb_ptr, | 101 | vxge_hw_vpath_poll_tx(fifo->handle, &skb_ptr, |
103 | NR_SKB_COMPLETED, &more); | 102 | NR_SKB_COMPLETED, &more); |
104 | spin_unlock_irqrestore(&fifo->tx_lock, flags); | 103 | __netif_tx_unlock(fifo->txq); |
105 | } | 104 | } |
105 | |||
106 | /* free SKBs */ | 106 | /* free SKBs */ |
107 | for (temp = completed; temp != skb_ptr; temp++) | 107 | for (temp = completed; temp != skb_ptr; temp++) |
108 | dev_kfree_skb_irq(*temp); | 108 | dev_kfree_skb_irq(*temp); |
109 | } while (more) ; | 109 | } while (more); |
110 | } | 110 | } |
111 | 111 | ||
112 | static inline void VXGE_COMPLETE_ALL_TX(struct vxgedev *vdev) | 112 | static inline void VXGE_COMPLETE_ALL_TX(struct vxgedev *vdev) |
@@ -131,53 +131,6 @@ static inline void VXGE_COMPLETE_ALL_RX(struct vxgedev *vdev) | |||
131 | } | 131 | } |
132 | 132 | ||
133 | /* | 133 | /* |
134 | * MultiQ manipulation helper functions | ||
135 | */ | ||
136 | static inline int vxge_netif_queue_stopped(struct vxge_fifo *fifo) | ||
137 | { | ||
138 | struct net_device *dev = fifo->ndev; | ||
139 | struct netdev_queue *txq = NULL; | ||
140 | int vpath_no = fifo->driver_id; | ||
141 | int ret = 0; | ||
142 | |||
143 | if (fifo->tx_steering_type) | ||
144 | txq = netdev_get_tx_queue(dev, vpath_no); | ||
145 | else | ||
146 | txq = netdev_get_tx_queue(dev, 0); | ||
147 | |||
148 | ret = netif_tx_queue_stopped(txq); | ||
149 | return ret; | ||
150 | } | ||
151 | |||
152 | void vxge_stop_tx_queue(struct vxge_fifo *fifo) | ||
153 | { | ||
154 | struct net_device *dev = fifo->ndev; | ||
155 | struct netdev_queue *txq = NULL; | ||
156 | |||
157 | if (fifo->tx_steering_type) | ||
158 | txq = netdev_get_tx_queue(dev, fifo->driver_id); | ||
159 | else | ||
160 | txq = netdev_get_tx_queue(dev, 0); | ||
161 | |||
162 | netif_tx_stop_queue(txq); | ||
163 | } | ||
164 | |||
165 | void vxge_wake_tx_queue(struct vxge_fifo *fifo) | ||
166 | { | ||
167 | struct net_device *dev = fifo->ndev; | ||
168 | struct netdev_queue *txq = NULL; | ||
169 | int vpath_no = fifo->driver_id; | ||
170 | |||
171 | if (fifo->tx_steering_type) | ||
172 | txq = netdev_get_tx_queue(dev, vpath_no); | ||
173 | else | ||
174 | txq = netdev_get_tx_queue(dev, 0); | ||
175 | |||
176 | if (netif_tx_queue_stopped(txq)) | ||
177 | netif_tx_wake_queue(txq); | ||
178 | } | ||
179 | |||
180 | /* | ||
181 | * vxge_callback_link_up | 134 | * vxge_callback_link_up |
182 | * | 135 | * |
183 | * This function is called during interrupt context to notify link up state | 136 | * This function is called during interrupt context to notify link up state |
@@ -650,7 +603,8 @@ vxge_xmit_compl(struct __vxge_hw_fifo *fifo_hw, void *dtr, | |||
650 | &dtr, &t_code) == VXGE_HW_OK); | 603 | &dtr, &t_code) == VXGE_HW_OK); |
651 | 604 | ||
652 | *skb_ptr = done_skb; | 605 | *skb_ptr = done_skb; |
653 | vxge_wake_tx_queue(fifo); | 606 | if (netif_tx_queue_stopped(fifo->txq)) |
607 | netif_tx_wake_queue(fifo->txq); | ||
654 | 608 | ||
655 | vxge_debug_entryexit(VXGE_TRACE, | 609 | vxge_debug_entryexit(VXGE_TRACE, |
656 | "%s: %s:%d Exiting...", | 610 | "%s: %s:%d Exiting...", |
@@ -659,8 +613,7 @@ vxge_xmit_compl(struct __vxge_hw_fifo *fifo_hw, void *dtr, | |||
659 | } | 613 | } |
660 | 614 | ||
661 | /* select a vpath to transmit the packet */ | 615 | /* select a vpath to transmit the packet */ |
662 | static u32 vxge_get_vpath_no(struct vxgedev *vdev, struct sk_buff *skb, | 616 | static u32 vxge_get_vpath_no(struct vxgedev *vdev, struct sk_buff *skb) |
663 | int *do_lock) | ||
664 | { | 617 | { |
665 | u16 queue_len, counter = 0; | 618 | u16 queue_len, counter = 0; |
666 | if (skb->protocol == htons(ETH_P_IP)) { | 619 | if (skb->protocol == htons(ETH_P_IP)) { |
@@ -679,12 +632,6 @@ static u32 vxge_get_vpath_no(struct vxgedev *vdev, struct sk_buff *skb, | |||
679 | vdev->vpath_selector[queue_len - 1]; | 632 | vdev->vpath_selector[queue_len - 1]; |
680 | if (counter >= queue_len) | 633 | if (counter >= queue_len) |
681 | counter = queue_len - 1; | 634 | counter = queue_len - 1; |
682 | |||
683 | if (ip->protocol == IPPROTO_UDP) { | ||
684 | #ifdef NETIF_F_LLTX | ||
685 | *do_lock = 0; | ||
686 | #endif | ||
687 | } | ||
688 | } | 635 | } |
689 | } | 636 | } |
690 | return counter; | 637 | return counter; |
@@ -781,8 +728,6 @@ static int vxge_learn_mac(struct vxgedev *vdev, u8 *mac_header) | |||
781 | * | 728 | * |
782 | * This function is the Tx entry point of the driver. Neterion NIC supports | 729 | * This function is the Tx entry point of the driver. Neterion NIC supports |
783 | * certain protocol assist features on Tx side, namely CSO, S/G, LSO. | 730 | * certain protocol assist features on Tx side, namely CSO, S/G, LSO. |
784 | * NOTE: when device cant queue the pkt, just the trans_start variable will | ||
785 | * not be upadted. | ||
786 | */ | 731 | */ |
787 | static netdev_tx_t | 732 | static netdev_tx_t |
788 | vxge_xmit(struct sk_buff *skb, struct net_device *dev) | 733 | vxge_xmit(struct sk_buff *skb, struct net_device *dev) |
@@ -799,9 +744,7 @@ vxge_xmit(struct sk_buff *skb, struct net_device *dev) | |||
799 | struct vxge_tx_priv *txdl_priv = NULL; | 744 | struct vxge_tx_priv *txdl_priv = NULL; |
800 | struct __vxge_hw_fifo *fifo_hw; | 745 | struct __vxge_hw_fifo *fifo_hw; |
801 | int offload_type; | 746 | int offload_type; |
802 | unsigned long flags = 0; | ||
803 | int vpath_no = 0; | 747 | int vpath_no = 0; |
804 | int do_spin_tx_lock = 1; | ||
805 | 748 | ||
806 | vxge_debug_entryexit(VXGE_TRACE, "%s: %s:%d", | 749 | vxge_debug_entryexit(VXGE_TRACE, "%s: %s:%d", |
807 | dev->name, __func__, __LINE__); | 750 | dev->name, __func__, __LINE__); |
@@ -837,7 +780,7 @@ vxge_xmit(struct sk_buff *skb, struct net_device *dev) | |||
837 | if (vdev->config.tx_steering_type == TX_MULTIQ_STEERING) | 780 | if (vdev->config.tx_steering_type == TX_MULTIQ_STEERING) |
838 | vpath_no = skb_get_queue_mapping(skb); | 781 | vpath_no = skb_get_queue_mapping(skb); |
839 | else if (vdev->config.tx_steering_type == TX_PORT_STEERING) | 782 | else if (vdev->config.tx_steering_type == TX_PORT_STEERING) |
840 | vpath_no = vxge_get_vpath_no(vdev, skb, &do_spin_tx_lock); | 783 | vpath_no = vxge_get_vpath_no(vdev, skb); |
841 | 784 | ||
842 | vxge_debug_tx(VXGE_TRACE, "%s: vpath_no= %d", dev->name, vpath_no); | 785 | vxge_debug_tx(VXGE_TRACE, "%s: vpath_no= %d", dev->name, vpath_no); |
843 | 786 | ||
@@ -847,40 +790,29 @@ vxge_xmit(struct sk_buff *skb, struct net_device *dev) | |||
847 | fifo = &vdev->vpaths[vpath_no].fifo; | 790 | fifo = &vdev->vpaths[vpath_no].fifo; |
848 | fifo_hw = fifo->handle; | 791 | fifo_hw = fifo->handle; |
849 | 792 | ||
850 | if (do_spin_tx_lock) | 793 | if (netif_tx_queue_stopped(fifo->txq)) |
851 | spin_lock_irqsave(&fifo->tx_lock, flags); | ||
852 | else { | ||
853 | if (unlikely(!spin_trylock_irqsave(&fifo->tx_lock, flags))) | ||
854 | return NETDEV_TX_LOCKED; | ||
855 | } | ||
856 | |||
857 | if (vxge_netif_queue_stopped(fifo)) { | ||
858 | spin_unlock_irqrestore(&fifo->tx_lock, flags); | ||
859 | return NETDEV_TX_BUSY; | 794 | return NETDEV_TX_BUSY; |
860 | } | ||
861 | 795 | ||
862 | avail = vxge_hw_fifo_free_txdl_count_get(fifo_hw); | 796 | avail = vxge_hw_fifo_free_txdl_count_get(fifo_hw); |
863 | if (avail == 0) { | 797 | if (avail == 0) { |
864 | vxge_debug_tx(VXGE_ERR, | 798 | vxge_debug_tx(VXGE_ERR, |
865 | "%s: No free TXDs available", dev->name); | 799 | "%s: No free TXDs available", dev->name); |
866 | fifo->stats.txd_not_free++; | 800 | fifo->stats.txd_not_free++; |
867 | vxge_stop_tx_queue(fifo); | 801 | goto _exit0; |
868 | goto _exit2; | ||
869 | } | 802 | } |
870 | 803 | ||
871 | /* Last TXD? Stop tx queue to avoid dropping packets. TX | 804 | /* Last TXD? Stop tx queue to avoid dropping packets. TX |
872 | * completion will resume the queue. | 805 | * completion will resume the queue. |
873 | */ | 806 | */ |
874 | if (avail == 1) | 807 | if (avail == 1) |
875 | vxge_stop_tx_queue(fifo); | 808 | netif_tx_stop_queue(fifo->txq); |
876 | 809 | ||
877 | status = vxge_hw_fifo_txdl_reserve(fifo_hw, &dtr, &dtr_priv); | 810 | status = vxge_hw_fifo_txdl_reserve(fifo_hw, &dtr, &dtr_priv); |
878 | if (unlikely(status != VXGE_HW_OK)) { | 811 | if (unlikely(status != VXGE_HW_OK)) { |
879 | vxge_debug_tx(VXGE_ERR, | 812 | vxge_debug_tx(VXGE_ERR, |
880 | "%s: Out of descriptors .", dev->name); | 813 | "%s: Out of descriptors .", dev->name); |
881 | fifo->stats.txd_out_of_desc++; | 814 | fifo->stats.txd_out_of_desc++; |
882 | vxge_stop_tx_queue(fifo); | 815 | goto _exit0; |
883 | goto _exit2; | ||
884 | } | 816 | } |
885 | 817 | ||
886 | vxge_debug_tx(VXGE_TRACE, | 818 | vxge_debug_tx(VXGE_TRACE, |
@@ -900,9 +832,8 @@ vxge_xmit(struct sk_buff *skb, struct net_device *dev) | |||
900 | 832 | ||
901 | if (unlikely(pci_dma_mapping_error(fifo->pdev, dma_pointer))) { | 833 | if (unlikely(pci_dma_mapping_error(fifo->pdev, dma_pointer))) { |
902 | vxge_hw_fifo_txdl_free(fifo_hw, dtr); | 834 | vxge_hw_fifo_txdl_free(fifo_hw, dtr); |
903 | vxge_stop_tx_queue(fifo); | ||
904 | fifo->stats.pci_map_fail++; | 835 | fifo->stats.pci_map_fail++; |
905 | goto _exit2; | 836 | goto _exit0; |
906 | } | 837 | } |
907 | 838 | ||
908 | txdl_priv = vxge_hw_fifo_txdl_private_get(dtr); | 839 | txdl_priv = vxge_hw_fifo_txdl_private_get(dtr); |
@@ -925,13 +856,12 @@ vxge_xmit(struct sk_buff *skb, struct net_device *dev) | |||
925 | if (!frag->size) | 856 | if (!frag->size) |
926 | continue; | 857 | continue; |
927 | 858 | ||
928 | dma_pointer = | 859 | dma_pointer = (u64) pci_map_page(fifo->pdev, frag->page, |
929 | (u64)pci_map_page(fifo->pdev, frag->page, | ||
930 | frag->page_offset, frag->size, | 860 | frag->page_offset, frag->size, |
931 | PCI_DMA_TODEVICE); | 861 | PCI_DMA_TODEVICE); |
932 | 862 | ||
933 | if (unlikely(pci_dma_mapping_error(fifo->pdev, dma_pointer))) | 863 | if (unlikely(pci_dma_mapping_error(fifo->pdev, dma_pointer))) |
934 | goto _exit0; | 864 | goto _exit2; |
935 | vxge_debug_tx(VXGE_TRACE, | 865 | vxge_debug_tx(VXGE_TRACE, |
936 | "%s: %s:%d frag = %d dma_pointer = 0x%llx", | 866 | "%s: %s:%d frag = %d dma_pointer = 0x%llx", |
937 | dev->name, __func__, __LINE__, i, | 867 | dev->name, __func__, __LINE__, i, |
@@ -946,11 +876,9 @@ vxge_xmit(struct sk_buff *skb, struct net_device *dev) | |||
946 | offload_type = vxge_offload_type(skb); | 876 | offload_type = vxge_offload_type(skb); |
947 | 877 | ||
948 | if (offload_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { | 878 | if (offload_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { |
949 | |||
950 | int mss = vxge_tcp_mss(skb); | 879 | int mss = vxge_tcp_mss(skb); |
951 | if (mss) { | 880 | if (mss) { |
952 | vxge_debug_tx(VXGE_TRACE, | 881 | vxge_debug_tx(VXGE_TRACE, "%s: %s:%d mss = %d", |
953 | "%s: %s:%d mss = %d", | ||
954 | dev->name, __func__, __LINE__, mss); | 882 | dev->name, __func__, __LINE__, mss); |
955 | vxge_hw_fifo_txdl_mss_set(dtr, mss); | 883 | vxge_hw_fifo_txdl_mss_set(dtr, mss); |
956 | } else { | 884 | } else { |
@@ -968,19 +896,13 @@ vxge_xmit(struct sk_buff *skb, struct net_device *dev) | |||
968 | VXGE_HW_FIFO_TXD_TX_CKO_UDP_EN); | 896 | VXGE_HW_FIFO_TXD_TX_CKO_UDP_EN); |
969 | 897 | ||
970 | vxge_hw_fifo_txdl_post(fifo_hw, dtr); | 898 | vxge_hw_fifo_txdl_post(fifo_hw, dtr); |
971 | #ifdef NETIF_F_LLTX | ||
972 | dev->trans_start = jiffies; /* NETIF_F_LLTX driver :( */ | ||
973 | #endif | ||
974 | spin_unlock_irqrestore(&fifo->tx_lock, flags); | ||
975 | 899 | ||
976 | VXGE_COMPLETE_VPATH_TX(fifo); | ||
977 | vxge_debug_entryexit(VXGE_TRACE, "%s: %s:%d Exiting...", | 900 | vxge_debug_entryexit(VXGE_TRACE, "%s: %s:%d Exiting...", |
978 | dev->name, __func__, __LINE__); | 901 | dev->name, __func__, __LINE__); |
979 | return NETDEV_TX_OK; | 902 | return NETDEV_TX_OK; |
980 | 903 | ||
981 | _exit0: | 904 | _exit2: |
982 | vxge_debug_tx(VXGE_TRACE, "%s: pci_map_page failed", dev->name); | 905 | vxge_debug_tx(VXGE_TRACE, "%s: pci_map_page failed", dev->name); |
983 | |||
984 | _exit1: | 906 | _exit1: |
985 | j = 0; | 907 | j = 0; |
986 | frag = &skb_shinfo(skb)->frags[0]; | 908 | frag = &skb_shinfo(skb)->frags[0]; |
@@ -995,10 +917,9 @@ _exit1: | |||
995 | } | 917 | } |
996 | 918 | ||
997 | vxge_hw_fifo_txdl_free(fifo_hw, dtr); | 919 | vxge_hw_fifo_txdl_free(fifo_hw, dtr); |
998 | _exit2: | 920 | _exit0: |
921 | netif_tx_stop_queue(fifo->txq); | ||
999 | dev_kfree_skb(skb); | 922 | dev_kfree_skb(skb); |
1000 | spin_unlock_irqrestore(&fifo->tx_lock, flags); | ||
1001 | VXGE_COMPLETE_VPATH_TX(fifo); | ||
1002 | 923 | ||
1003 | return NETDEV_TX_OK; | 924 | return NETDEV_TX_OK; |
1004 | } | 925 | } |
@@ -1448,7 +1369,8 @@ static int vxge_reset_vpath(struct vxgedev *vdev, int vp_id) | |||
1448 | clear_bit(vp_id, &vdev->vp_reset); | 1369 | clear_bit(vp_id, &vdev->vp_reset); |
1449 | 1370 | ||
1450 | /* Start the vpath queue */ | 1371 | /* Start the vpath queue */ |
1451 | vxge_wake_tx_queue(&vpath->fifo); | 1372 | if (netif_tx_queue_stopped(vpath->fifo.txq)) |
1373 | netif_tx_wake_queue(vpath->fifo.txq); | ||
1452 | 1374 | ||
1453 | return ret; | 1375 | return ret; |
1454 | } | 1376 | } |
@@ -2078,6 +2000,12 @@ int vxge_open_vpaths(struct vxgedev *vdev) | |||
2078 | vdev->config.tx_steering_type; | 2000 | vdev->config.tx_steering_type; |
2079 | vpath->fifo.ndev = vdev->ndev; | 2001 | vpath->fifo.ndev = vdev->ndev; |
2080 | vpath->fifo.pdev = vdev->pdev; | 2002 | vpath->fifo.pdev = vdev->pdev; |
2003 | if (vdev->config.tx_steering_type) | ||
2004 | vpath->fifo.txq = | ||
2005 | netdev_get_tx_queue(vdev->ndev, i); | ||
2006 | else | ||
2007 | vpath->fifo.txq = | ||
2008 | netdev_get_tx_queue(vdev->ndev, 0); | ||
2081 | vpath->fifo.indicate_max_pkts = | 2009 | vpath->fifo.indicate_max_pkts = |
2082 | vdev->config.fifo_indicate_max_pkts; | 2010 | vdev->config.fifo_indicate_max_pkts; |
2083 | vpath->ring.rx_vector_no = 0; | 2011 | vpath->ring.rx_vector_no = 0; |
@@ -2564,7 +2492,7 @@ static void vxge_poll_vp_lockup(unsigned long data) | |||
2564 | vxge_vpath_intr_disable(vdev, i); | 2492 | vxge_vpath_intr_disable(vdev, i); |
2565 | 2493 | ||
2566 | /* stop the queue for this vpath */ | 2494 | /* stop the queue for this vpath */ |
2567 | vxge_stop_tx_queue(&vpath->fifo); | 2495 | netif_tx_stop_queue(vpath->fifo.txq); |
2568 | continue; | 2496 | continue; |
2569 | } | 2497 | } |
2570 | } | 2498 | } |
@@ -2627,7 +2555,6 @@ vxge_open(struct net_device *dev) | |||
2627 | goto out1; | 2555 | goto out1; |
2628 | } | 2556 | } |
2629 | 2557 | ||
2630 | |||
2631 | if (vdev->config.intr_type != MSI_X) { | 2558 | if (vdev->config.intr_type != MSI_X) { |
2632 | netif_napi_add(dev, &vdev->napi, vxge_poll_inta, | 2559 | netif_napi_add(dev, &vdev->napi, vxge_poll_inta, |
2633 | vdev->config.napi_weight); | 2560 | vdev->config.napi_weight); |
@@ -3200,7 +3127,7 @@ int __devinit vxge_device_register(struct __vxge_hw_device *hldev, | |||
3200 | struct net_device *ndev; | 3127 | struct net_device *ndev; |
3201 | enum vxge_hw_status status = VXGE_HW_OK; | 3128 | enum vxge_hw_status status = VXGE_HW_OK; |
3202 | struct vxgedev *vdev; | 3129 | struct vxgedev *vdev; |
3203 | int i, ret = 0, no_of_queue = 1; | 3130 | int ret = 0, no_of_queue = 1; |
3204 | u64 stat; | 3131 | u64 stat; |
3205 | 3132 | ||
3206 | *vdev_out = NULL; | 3133 | *vdev_out = NULL; |
@@ -3273,13 +3200,6 @@ int __devinit vxge_device_register(struct __vxge_hw_device *hldev, | |||
3273 | if (vdev->config.gro_enable) | 3200 | if (vdev->config.gro_enable) |
3274 | ndev->features |= NETIF_F_GRO; | 3201 | ndev->features |= NETIF_F_GRO; |
3275 | 3202 | ||
3276 | #ifdef NETIF_F_LLTX | ||
3277 | ndev->features |= NETIF_F_LLTX; | ||
3278 | #endif | ||
3279 | |||
3280 | for (i = 0; i < no_of_vpath; i++) | ||
3281 | spin_lock_init(&vdev->vpaths[i].fifo.tx_lock); | ||
3282 | |||
3283 | if (register_netdev(ndev)) { | 3203 | if (register_netdev(ndev)) { |
3284 | vxge_debug_init(vxge_hw_device_trace_level_get(hldev), | 3204 | vxge_debug_init(vxge_hw_device_trace_level_get(hldev), |
3285 | "%s: %s : device registration failed!", | 3205 | "%s: %s : device registration failed!", |
@@ -3379,6 +3299,7 @@ vxge_callback_crit_err(struct __vxge_hw_device *hldev, | |||
3379 | { | 3299 | { |
3380 | struct net_device *dev = hldev->ndev; | 3300 | struct net_device *dev = hldev->ndev; |
3381 | struct vxgedev *vdev = (struct vxgedev *)netdev_priv(dev); | 3301 | struct vxgedev *vdev = (struct vxgedev *)netdev_priv(dev); |
3302 | struct vxge_vpath *vpath = NULL; | ||
3382 | int vpath_idx; | 3303 | int vpath_idx; |
3383 | 3304 | ||
3384 | vxge_debug_entryexit(vdev->level_trace, | 3305 | vxge_debug_entryexit(vdev->level_trace, |
@@ -3389,9 +3310,11 @@ vxge_callback_crit_err(struct __vxge_hw_device *hldev, | |||
3389 | */ | 3310 | */ |
3390 | vdev->cric_err_event = type; | 3311 | vdev->cric_err_event = type; |
3391 | 3312 | ||
3392 | for (vpath_idx = 0; vpath_idx < vdev->no_of_vpath; vpath_idx++) | 3313 | for (vpath_idx = 0; vpath_idx < vdev->no_of_vpath; vpath_idx++) { |
3393 | if (vdev->vpaths[vpath_idx].device_id == vp_id) | 3314 | vpath = &vdev->vpaths[vpath_idx]; |
3315 | if (vpath->device_id == vp_id) | ||
3394 | break; | 3316 | break; |
3317 | } | ||
3395 | 3318 | ||
3396 | if (!test_bit(__VXGE_STATE_RESET_CARD, &vdev->state)) { | 3319 | if (!test_bit(__VXGE_STATE_RESET_CARD, &vdev->state)) { |
3397 | if (type == VXGE_HW_EVENT_SLOT_FREEZE) { | 3320 | if (type == VXGE_HW_EVENT_SLOT_FREEZE) { |
@@ -3428,8 +3351,7 @@ vxge_callback_crit_err(struct __vxge_hw_device *hldev, | |||
3428 | vxge_vpath_intr_disable(vdev, vpath_idx); | 3351 | vxge_vpath_intr_disable(vdev, vpath_idx); |
3429 | 3352 | ||
3430 | /* stop the queue for this vpath */ | 3353 | /* stop the queue for this vpath */ |
3431 | vxge_stop_tx_queue(&vdev->vpaths[vpath_idx]. | 3354 | netif_tx_stop_queue(vpath->fifo.txq); |
3432 | fifo); | ||
3433 | } | 3355 | } |
3434 | } | 3356 | } |
3435 | } | 3357 | } |
@@ -4274,7 +4196,6 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
4274 | 4196 | ||
4275 | vdev->vpaths[j].is_configured = 1; | 4197 | vdev->vpaths[j].is_configured = 1; |
4276 | vdev->vpaths[j].device_id = i; | 4198 | vdev->vpaths[j].device_id = i; |
4277 | vdev->vpaths[j].fifo.driver_id = j; | ||
4278 | vdev->vpaths[j].ring.driver_id = j; | 4199 | vdev->vpaths[j].ring.driver_id = j; |
4279 | vdev->vpaths[j].vdev = vdev; | 4200 | vdev->vpaths[j].vdev = vdev; |
4280 | vdev->vpaths[j].max_mac_addr_cnt = max_mac_vpath; | 4201 | vdev->vpaths[j].max_mac_addr_cnt = max_mac_vpath; |
diff --git a/drivers/net/vxge/vxge-main.h b/drivers/net/vxge/vxge-main.h index a3845822d46e..5982396787fc 100644 --- a/drivers/net/vxge/vxge-main.h +++ b/drivers/net/vxge/vxge-main.h | |||
@@ -217,17 +217,13 @@ struct vxge_fifo_stats { | |||
217 | }; | 217 | }; |
218 | 218 | ||
219 | struct vxge_fifo { | 219 | struct vxge_fifo { |
220 | struct net_device *ndev; | 220 | struct net_device *ndev; |
221 | struct pci_dev *pdev; | 221 | struct pci_dev *pdev; |
222 | struct __vxge_hw_fifo *handle; | 222 | struct __vxge_hw_fifo *handle; |
223 | struct netdev_queue *txq; | ||
223 | 224 | ||
224 | /* The vpath id maintained in the driver - | ||
225 | * 0 to 'maximum_vpaths_in_function - 1' | ||
226 | */ | ||
227 | int driver_id; | ||
228 | int tx_steering_type; | 225 | int tx_steering_type; |
229 | int indicate_max_pkts; | 226 | int indicate_max_pkts; |
230 | spinlock_t tx_lock; | ||
231 | 227 | ||
232 | /* Tx stats */ | 228 | /* Tx stats */ |
233 | struct vxge_fifo_stats stats; | 229 | struct vxge_fifo_stats stats; |
@@ -275,7 +271,6 @@ struct vxge_ring { | |||
275 | } ____cacheline_aligned; | 271 | } ____cacheline_aligned; |
276 | 272 | ||
277 | struct vxge_vpath { | 273 | struct vxge_vpath { |
278 | |||
279 | struct vxge_fifo fifo; | 274 | struct vxge_fifo fifo; |
280 | struct vxge_ring ring; | 275 | struct vxge_ring ring; |
281 | 276 | ||
@@ -443,10 +438,6 @@ int vxge_open_vpaths(struct vxgedev *vdev); | |||
443 | 438 | ||
444 | enum vxge_hw_status vxge_reset_all_vpaths(struct vxgedev *vdev); | 439 | enum vxge_hw_status vxge_reset_all_vpaths(struct vxgedev *vdev); |
445 | 440 | ||
446 | void vxge_stop_tx_queue(struct vxge_fifo *fifo); | ||
447 | |||
448 | void vxge_wake_tx_queue(struct vxge_fifo *fifo); | ||
449 | |||
450 | enum vxge_hw_status vxge_add_mac_addr(struct vxgedev *vdev, | 441 | enum vxge_hw_status vxge_add_mac_addr(struct vxgedev *vdev, |
451 | struct macInfo *mac); | 442 | struct macInfo *mac); |
452 | 443 | ||
diff --git a/drivers/net/vxge/vxge-traffic.c b/drivers/net/vxge/vxge-traffic.c index 6cc1dd79b40b..1a7078304adf 100644 --- a/drivers/net/vxge/vxge-traffic.c +++ b/drivers/net/vxge/vxge-traffic.c | |||
@@ -2466,14 +2466,12 @@ enum vxge_hw_status vxge_hw_vpath_poll_rx(struct __vxge_hw_ring *ring) | |||
2466 | * the same. | 2466 | * the same. |
2467 | * @fifo: Handle to the fifo object used for non offload send | 2467 | * @fifo: Handle to the fifo object used for non offload send |
2468 | * | 2468 | * |
2469 | * The function polls the Tx for the completed descriptors and calls | 2469 | * The function polls the Tx for the completed descriptors and calls |
2470 | * the driver via supplied completion callback. | 2470 | * the driver via supplied completion callback. |
2471 | * | 2471 | * |
2472 | * Returns: VXGE_HW_OK, if the polling is completed successful. | 2472 | * Returns: VXGE_HW_OK, if the polling is completed successful. |
2473 | * VXGE_HW_COMPLETIONS_REMAIN: There are still more completed | 2473 | * VXGE_HW_COMPLETIONS_REMAIN: There are still more completed |
2474 | * descriptors available which are yet to be processed. | 2474 | * descriptors available which are yet to be processed. |
2475 | * | ||
2476 | * See also: vxge_hw_vpath_poll_tx(). | ||
2477 | */ | 2475 | */ |
2478 | enum vxge_hw_status vxge_hw_vpath_poll_tx(struct __vxge_hw_fifo *fifo, | 2476 | enum vxge_hw_status vxge_hw_vpath_poll_tx(struct __vxge_hw_fifo *fifo, |
2479 | struct sk_buff ***skb_ptr, int nr_skb, | 2477 | struct sk_buff ***skb_ptr, int nr_skb, |