diff options
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 210 |
1 files changed, 129 insertions, 81 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index ba01524b553..d854f07ef4d 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -39,7 +39,9 @@ | |||
39 | #include "netxen_nic_phan_reg.h" | 39 | #include "netxen_nic_phan_reg.h" |
40 | 40 | ||
41 | #include <linux/dma-mapping.h> | 41 | #include <linux/dma-mapping.h> |
42 | #include <linux/if_vlan.h> | ||
42 | #include <net/ip.h> | 43 | #include <net/ip.h> |
44 | #include <linux/ipv6.h> | ||
43 | 45 | ||
44 | MODULE_DESCRIPTION("NetXen Multi port (1/10) Gigabit Network Driver"); | 46 | MODULE_DESCRIPTION("NetXen Multi port (1/10) Gigabit Network Driver"); |
45 | MODULE_LICENSE("GPL"); | 47 | MODULE_LICENSE("GPL"); |
@@ -242,7 +244,7 @@ static void netxen_check_options(struct netxen_adapter *adapter) | |||
242 | case NETXEN_BRDTYPE_P3_4_GB: | 244 | case NETXEN_BRDTYPE_P3_4_GB: |
243 | case NETXEN_BRDTYPE_P3_4_GB_MM: | 245 | case NETXEN_BRDTYPE_P3_4_GB_MM: |
244 | adapter->msix_supported = !!use_msi_x; | 246 | adapter->msix_supported = !!use_msi_x; |
245 | adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G; | 247 | adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G; |
246 | break; | 248 | break; |
247 | 249 | ||
248 | case NETXEN_BRDTYPE_P2_SB35_4G: | 250 | case NETXEN_BRDTYPE_P2_SB35_4G: |
@@ -251,6 +253,14 @@ static void netxen_check_options(struct netxen_adapter *adapter) | |||
251 | adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G; | 253 | adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G; |
252 | break; | 254 | break; |
253 | 255 | ||
256 | case NETXEN_BRDTYPE_P3_10G_TP: | ||
257 | adapter->msix_supported = !!use_msi_x; | ||
258 | if (adapter->ahw.board_type == NETXEN_NIC_XGBE) | ||
259 | adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G; | ||
260 | else | ||
261 | adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G; | ||
262 | break; | ||
263 | |||
254 | default: | 264 | default: |
255 | adapter->msix_supported = 0; | 265 | adapter->msix_supported = 0; |
256 | adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G; | 266 | adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G; |
@@ -271,10 +281,15 @@ static void netxen_check_options(struct netxen_adapter *adapter) | |||
271 | static int | 281 | static int |
272 | netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot) | 282 | netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot) |
273 | { | 283 | { |
274 | int ret = 0; | 284 | u32 val, timeout; |
275 | 285 | ||
276 | if (first_boot == 0x55555555) { | 286 | if (first_boot == 0x55555555) { |
277 | /* This is the first boot after power up */ | 287 | /* This is the first boot after power up */ |
288 | adapter->pci_write_normalize(adapter, | ||
289 | NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC); | ||
290 | |||
291 | if (!NX_IS_REVISION_P2(adapter->ahw.revision_id)) | ||
292 | return 0; | ||
278 | 293 | ||
279 | /* PCI bus master workaround */ | 294 | /* PCI bus master workaround */ |
280 | adapter->hw_read_wx(adapter, | 295 | adapter->hw_read_wx(adapter, |
@@ -294,18 +309,26 @@ netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot) | |||
294 | /* clear the register for future unloads/loads */ | 309 | /* clear the register for future unloads/loads */ |
295 | adapter->pci_write_normalize(adapter, | 310 | adapter->pci_write_normalize(adapter, |
296 | NETXEN_CAM_RAM(0x1fc), 0); | 311 | NETXEN_CAM_RAM(0x1fc), 0); |
297 | ret = -1; | 312 | return -EIO; |
298 | } | 313 | } |
299 | 314 | ||
300 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | 315 | /* Start P2 boot loader */ |
301 | /* Start P2 boot loader */ | 316 | val = adapter->pci_read_normalize(adapter, |
302 | adapter->pci_write_normalize(adapter, | 317 | NETXEN_ROMUSB_GLB_PEGTUNE_DONE); |
303 | NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC); | 318 | adapter->pci_write_normalize(adapter, |
304 | adapter->pci_write_normalize(adapter, | 319 | NETXEN_ROMUSB_GLB_PEGTUNE_DONE, val | 0x1); |
305 | NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1); | 320 | timeout = 0; |
306 | } | 321 | do { |
322 | msleep(1); | ||
323 | val = adapter->pci_read_normalize(adapter, | ||
324 | NETXEN_CAM_RAM(0x1fc)); | ||
325 | |||
326 | if (++timeout > 5000) | ||
327 | return -EIO; | ||
328 | |||
329 | } while (val == NETXEN_BDINFO_MAGIC); | ||
307 | } | 330 | } |
308 | return ret; | 331 | return 0; |
309 | } | 332 | } |
310 | 333 | ||
311 | static void netxen_set_port_mode(struct netxen_adapter *adapter) | 334 | static void netxen_set_port_mode(struct netxen_adapter *adapter) |
@@ -784,8 +807,8 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
784 | CRB_CMDPEG_STATE, 0); | 807 | CRB_CMDPEG_STATE, 0); |
785 | netxen_pinit_from_rom(adapter, 0); | 808 | netxen_pinit_from_rom(adapter, 0); |
786 | msleep(1); | 809 | msleep(1); |
787 | netxen_load_firmware(adapter); | ||
788 | } | 810 | } |
811 | netxen_load_firmware(adapter); | ||
789 | 812 | ||
790 | if (NX_IS_REVISION_P3(revision_id)) | 813 | if (NX_IS_REVISION_P3(revision_id)) |
791 | netxen_pcie_strap_init(adapter); | 814 | netxen_pcie_strap_init(adapter); |
@@ -801,13 +824,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
801 | 824 | ||
802 | } | 825 | } |
803 | 826 | ||
804 | if ((first_boot == 0x55555555) && | ||
805 | (NX_IS_REVISION_P2(revision_id))) { | ||
806 | /* Unlock the HW, prompting the boot sequence */ | ||
807 | adapter->pci_write_normalize(adapter, | ||
808 | NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1); | ||
809 | } | ||
810 | |||
811 | err = netxen_initialize_adapter_offload(adapter); | 827 | err = netxen_initialize_adapter_offload(adapter); |
812 | if (err) | 828 | if (err) |
813 | goto err_out_iounmap; | 829 | goto err_out_iounmap; |
@@ -821,7 +837,9 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
821 | adapter->pci_write_normalize(adapter, CRB_DRIVER_VERSION, i); | 837 | adapter->pci_write_normalize(adapter, CRB_DRIVER_VERSION, i); |
822 | 838 | ||
823 | /* Handshake with the card before we register the devices. */ | 839 | /* Handshake with the card before we register the devices. */ |
824 | netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); | 840 | err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); |
841 | if (err) | ||
842 | goto err_out_free_offload; | ||
825 | 843 | ||
826 | } /* first_driver */ | 844 | } /* first_driver */ |
827 | 845 | ||
@@ -925,6 +943,7 @@ err_out_disable_msi: | |||
925 | if (adapter->flags & NETXEN_NIC_MSI_ENABLED) | 943 | if (adapter->flags & NETXEN_NIC_MSI_ENABLED) |
926 | pci_disable_msi(pdev); | 944 | pci_disable_msi(pdev); |
927 | 945 | ||
946 | err_out_free_offload: | ||
928 | if (first_driver) | 947 | if (first_driver) |
929 | netxen_free_adapter_offload(adapter); | 948 | netxen_free_adapter_offload(adapter); |
930 | 949 | ||
@@ -968,6 +987,9 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
968 | netxen_free_hw_resources(adapter); | 987 | netxen_free_hw_resources(adapter); |
969 | netxen_release_rx_buffers(adapter); | 988 | netxen_release_rx_buffers(adapter); |
970 | netxen_free_sw_resources(adapter); | 989 | netxen_free_sw_resources(adapter); |
990 | |||
991 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) | ||
992 | netxen_p3_free_mac_list(adapter); | ||
971 | } | 993 | } |
972 | 994 | ||
973 | if (adapter->portnum == 0) | 995 | if (adapter->portnum == 0) |
@@ -983,8 +1005,10 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
983 | 1005 | ||
984 | iounmap(adapter->ahw.db_base); | 1006 | iounmap(adapter->ahw.db_base); |
985 | iounmap(adapter->ahw.pci_base0); | 1007 | iounmap(adapter->ahw.pci_base0); |
986 | iounmap(adapter->ahw.pci_base1); | 1008 | if (adapter->ahw.pci_base1 != NULL) |
987 | iounmap(adapter->ahw.pci_base2); | 1009 | iounmap(adapter->ahw.pci_base1); |
1010 | if (adapter->ahw.pci_base2 != NULL) | ||
1011 | iounmap(adapter->ahw.pci_base2); | ||
988 | 1012 | ||
989 | pci_release_regions(pdev); | 1013 | pci_release_regions(pdev); |
990 | pci_disable_device(pdev); | 1014 | pci_disable_device(pdev); |
@@ -1137,29 +1161,64 @@ static int netxen_nic_close(struct net_device *netdev) | |||
1137 | return 0; | 1161 | return 0; |
1138 | } | 1162 | } |
1139 | 1163 | ||
1140 | void netxen_tso_check(struct netxen_adapter *adapter, | 1164 | static bool netxen_tso_check(struct net_device *netdev, |
1141 | struct cmd_desc_type0 *desc, struct sk_buff *skb) | 1165 | struct cmd_desc_type0 *desc, struct sk_buff *skb) |
1142 | { | 1166 | { |
1143 | if (desc->mss) { | 1167 | bool tso = false; |
1144 | desc->total_hdr_length = (sizeof(struct ethhdr) + | 1168 | u8 opcode = TX_ETHER_PKT; |
1145 | ip_hdrlen(skb) + tcp_hdrlen(skb)); | ||
1146 | 1169 | ||
1147 | if ((NX_IS_REVISION_P3(adapter->ahw.revision_id)) && | 1170 | if ((netdev->features & (NETIF_F_TSO | NETIF_F_TSO6)) && |
1148 | (skb->protocol == htons(ETH_P_IPV6))) | 1171 | skb_shinfo(skb)->gso_size > 0) { |
1149 | netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO6); | 1172 | |
1150 | else | 1173 | desc->mss = cpu_to_le16(skb_shinfo(skb)->gso_size); |
1151 | netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO); | 1174 | desc->total_hdr_length = |
1175 | skb_transport_offset(skb) + tcp_hdrlen(skb); | ||
1176 | |||
1177 | opcode = (skb->protocol == htons(ETH_P_IPV6)) ? | ||
1178 | TX_TCP_LSO6 : TX_TCP_LSO; | ||
1179 | tso = true; | ||
1152 | 1180 | ||
1153 | } else if (skb->ip_summed == CHECKSUM_PARTIAL) { | 1181 | } else if (skb->ip_summed == CHECKSUM_PARTIAL) { |
1154 | if (ip_hdr(skb)->protocol == IPPROTO_TCP) | 1182 | u8 l4proto; |
1155 | netxen_set_cmd_desc_opcode(desc, TX_TCP_PKT); | 1183 | |
1156 | else if (ip_hdr(skb)->protocol == IPPROTO_UDP) | 1184 | if (skb->protocol == htons(ETH_P_IP)) { |
1157 | netxen_set_cmd_desc_opcode(desc, TX_UDP_PKT); | 1185 | l4proto = ip_hdr(skb)->protocol; |
1158 | else | 1186 | |
1159 | return; | 1187 | if (l4proto == IPPROTO_TCP) |
1188 | opcode = TX_TCP_PKT; | ||
1189 | else if(l4proto == IPPROTO_UDP) | ||
1190 | opcode = TX_UDP_PKT; | ||
1191 | } else if (skb->protocol == htons(ETH_P_IPV6)) { | ||
1192 | l4proto = ipv6_hdr(skb)->nexthdr; | ||
1193 | |||
1194 | if (l4proto == IPPROTO_TCP) | ||
1195 | opcode = TX_TCPV6_PKT; | ||
1196 | else if(l4proto == IPPROTO_UDP) | ||
1197 | opcode = TX_UDPV6_PKT; | ||
1198 | } | ||
1160 | } | 1199 | } |
1161 | desc->tcp_hdr_offset = skb_transport_offset(skb); | 1200 | desc->tcp_hdr_offset = skb_transport_offset(skb); |
1162 | desc->ip_hdr_offset = skb_network_offset(skb); | 1201 | desc->ip_hdr_offset = skb_network_offset(skb); |
1202 | netxen_set_tx_flags_opcode(desc, 0, opcode); | ||
1203 | return tso; | ||
1204 | } | ||
1205 | |||
1206 | static void | ||
1207 | netxen_clean_tx_dma_mapping(struct pci_dev *pdev, | ||
1208 | struct netxen_cmd_buffer *pbuf, int last) | ||
1209 | { | ||
1210 | int k; | ||
1211 | struct netxen_skb_frag *buffrag; | ||
1212 | |||
1213 | buffrag = &pbuf->frag_array[0]; | ||
1214 | pci_unmap_single(pdev, buffrag->dma, | ||
1215 | buffrag->length, PCI_DMA_TODEVICE); | ||
1216 | |||
1217 | for (k = 1; k < last; k++) { | ||
1218 | buffrag = &pbuf->frag_array[k]; | ||
1219 | pci_unmap_page(pdev, buffrag->dma, | ||
1220 | buffrag->length, PCI_DMA_TODEVICE); | ||
1221 | } | ||
1163 | } | 1222 | } |
1164 | 1223 | ||
1165 | static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | 1224 | static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) |
@@ -1167,33 +1226,22 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1167 | struct netxen_adapter *adapter = netdev_priv(netdev); | 1226 | struct netxen_adapter *adapter = netdev_priv(netdev); |
1168 | struct netxen_hardware_context *hw = &adapter->ahw; | 1227 | struct netxen_hardware_context *hw = &adapter->ahw; |
1169 | unsigned int first_seg_len = skb->len - skb->data_len; | 1228 | unsigned int first_seg_len = skb->len - skb->data_len; |
1229 | struct netxen_cmd_buffer *pbuf; | ||
1170 | struct netxen_skb_frag *buffrag; | 1230 | struct netxen_skb_frag *buffrag; |
1171 | unsigned int i; | 1231 | struct cmd_desc_type0 *hwdesc; |
1232 | struct pci_dev *pdev = adapter->pdev; | ||
1233 | dma_addr_t temp_dma; | ||
1234 | int i, k; | ||
1172 | 1235 | ||
1173 | u32 producer, consumer; | 1236 | u32 producer, consumer; |
1174 | u32 saved_producer = 0; | 1237 | int frag_count, no_of_desc; |
1175 | struct cmd_desc_type0 *hwdesc; | ||
1176 | int k; | ||
1177 | struct netxen_cmd_buffer *pbuf = NULL; | ||
1178 | int frag_count; | ||
1179 | int no_of_desc; | ||
1180 | u32 num_txd = adapter->max_tx_desc_count; | 1238 | u32 num_txd = adapter->max_tx_desc_count; |
1239 | bool is_tso = false; | ||
1181 | 1240 | ||
1182 | frag_count = skb_shinfo(skb)->nr_frags + 1; | 1241 | frag_count = skb_shinfo(skb)->nr_frags + 1; |
1183 | 1242 | ||
1184 | /* There 4 fragments per descriptor */ | 1243 | /* There 4 fragments per descriptor */ |
1185 | no_of_desc = (frag_count + 3) >> 2; | 1244 | no_of_desc = (frag_count + 3) >> 2; |
1186 | if (netdev->features & (NETIF_F_TSO | NETIF_F_TSO6)) { | ||
1187 | if (skb_shinfo(skb)->gso_size > 0) { | ||
1188 | |||
1189 | no_of_desc++; | ||
1190 | if ((ip_hdrlen(skb) + tcp_hdrlen(skb) + | ||
1191 | sizeof(struct ethhdr)) > | ||
1192 | (sizeof(struct cmd_desc_type0) - 2)) { | ||
1193 | no_of_desc++; | ||
1194 | } | ||
1195 | } | ||
1196 | } | ||
1197 | 1245 | ||
1198 | producer = adapter->cmd_producer; | 1246 | producer = adapter->cmd_producer; |
1199 | smp_mb(); | 1247 | smp_mb(); |
@@ -1205,34 +1253,26 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1205 | } | 1253 | } |
1206 | 1254 | ||
1207 | /* Copy the descriptors into the hardware */ | 1255 | /* Copy the descriptors into the hardware */ |
1208 | saved_producer = producer; | ||
1209 | hwdesc = &hw->cmd_desc_head[producer]; | 1256 | hwdesc = &hw->cmd_desc_head[producer]; |
1210 | memset(hwdesc, 0, sizeof(struct cmd_desc_type0)); | 1257 | memset(hwdesc, 0, sizeof(struct cmd_desc_type0)); |
1211 | /* Take skb->data itself */ | 1258 | /* Take skb->data itself */ |
1212 | pbuf = &adapter->cmd_buf_arr[producer]; | 1259 | pbuf = &adapter->cmd_buf_arr[producer]; |
1213 | if ((netdev->features & (NETIF_F_TSO | NETIF_F_TSO6)) && | 1260 | |
1214 | skb_shinfo(skb)->gso_size > 0) { | 1261 | is_tso = netxen_tso_check(netdev, hwdesc, skb); |
1215 | pbuf->mss = skb_shinfo(skb)->gso_size; | 1262 | |
1216 | hwdesc->mss = cpu_to_le16(skb_shinfo(skb)->gso_size); | ||
1217 | } else { | ||
1218 | pbuf->mss = 0; | ||
1219 | hwdesc->mss = 0; | ||
1220 | } | ||
1221 | pbuf->total_length = skb->len; | ||
1222 | pbuf->skb = skb; | 1263 | pbuf->skb = skb; |
1223 | pbuf->cmd = TX_ETHER_PKT; | ||
1224 | pbuf->frag_count = frag_count; | 1264 | pbuf->frag_count = frag_count; |
1225 | pbuf->port = adapter->portnum; | ||
1226 | buffrag = &pbuf->frag_array[0]; | 1265 | buffrag = &pbuf->frag_array[0]; |
1227 | buffrag->dma = pci_map_single(adapter->pdev, skb->data, first_seg_len, | 1266 | temp_dma = pci_map_single(pdev, skb->data, first_seg_len, |
1228 | PCI_DMA_TODEVICE); | 1267 | PCI_DMA_TODEVICE); |
1268 | if (pci_dma_mapping_error(pdev, temp_dma)) | ||
1269 | goto drop_packet; | ||
1270 | |||
1271 | buffrag->dma = temp_dma; | ||
1229 | buffrag->length = first_seg_len; | 1272 | buffrag->length = first_seg_len; |
1230 | netxen_set_cmd_desc_totallength(hwdesc, skb->len); | 1273 | netxen_set_tx_frags_len(hwdesc, frag_count, skb->len); |
1231 | netxen_set_cmd_desc_num_of_buff(hwdesc, frag_count); | 1274 | netxen_set_tx_port(hwdesc, adapter->portnum); |
1232 | netxen_set_cmd_desc_opcode(hwdesc, TX_ETHER_PKT); | ||
1233 | 1275 | ||
1234 | netxen_set_cmd_desc_port(hwdesc, adapter->portnum); | ||
1235 | netxen_set_cmd_desc_ctxid(hwdesc, adapter->portnum); | ||
1236 | hwdesc->buffer1_length = cpu_to_le16(first_seg_len); | 1276 | hwdesc->buffer1_length = cpu_to_le16(first_seg_len); |
1237 | hwdesc->addr_buffer1 = cpu_to_le64(buffrag->dma); | 1277 | hwdesc->addr_buffer1 = cpu_to_le64(buffrag->dma); |
1238 | 1278 | ||
@@ -1240,7 +1280,6 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1240 | struct skb_frag_struct *frag; | 1280 | struct skb_frag_struct *frag; |
1241 | int len, temp_len; | 1281 | int len, temp_len; |
1242 | unsigned long offset; | 1282 | unsigned long offset; |
1243 | dma_addr_t temp_dma; | ||
1244 | 1283 | ||
1245 | /* move to next desc. if there is a need */ | 1284 | /* move to next desc. if there is a need */ |
1246 | if ((i & 0x3) == 0) { | 1285 | if ((i & 0x3) == 0) { |
@@ -1256,8 +1295,12 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1256 | offset = frag->page_offset; | 1295 | offset = frag->page_offset; |
1257 | 1296 | ||
1258 | temp_len = len; | 1297 | temp_len = len; |
1259 | temp_dma = pci_map_page(adapter->pdev, frag->page, offset, | 1298 | temp_dma = pci_map_page(pdev, frag->page, offset, |
1260 | len, PCI_DMA_TODEVICE); | 1299 | len, PCI_DMA_TODEVICE); |
1300 | if (pci_dma_mapping_error(pdev, temp_dma)) { | ||
1301 | netxen_clean_tx_dma_mapping(pdev, pbuf, i); | ||
1302 | goto drop_packet; | ||
1303 | } | ||
1261 | 1304 | ||
1262 | buffrag++; | 1305 | buffrag++; |
1263 | buffrag->dma = temp_dma; | 1306 | buffrag->dma = temp_dma; |
@@ -1285,16 +1328,12 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1285 | } | 1328 | } |
1286 | producer = get_next_index(producer, num_txd); | 1329 | producer = get_next_index(producer, num_txd); |
1287 | 1330 | ||
1288 | /* might change opcode to TX_TCP_LSO */ | ||
1289 | netxen_tso_check(adapter, &hw->cmd_desc_head[saved_producer], skb); | ||
1290 | |||
1291 | /* For LSO, we need to copy the MAC/IP/TCP headers into | 1331 | /* For LSO, we need to copy the MAC/IP/TCP headers into |
1292 | * the descriptor ring | 1332 | * the descriptor ring |
1293 | */ | 1333 | */ |
1294 | if (netxen_get_cmd_desc_opcode(&hw->cmd_desc_head[saved_producer]) | 1334 | if (is_tso) { |
1295 | == TX_TCP_LSO) { | ||
1296 | int hdr_len, first_hdr_len, more_hdr; | 1335 | int hdr_len, first_hdr_len, more_hdr; |
1297 | hdr_len = hw->cmd_desc_head[saved_producer].total_hdr_length; | 1336 | hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb); |
1298 | if (hdr_len > (sizeof(struct cmd_desc_type0) - 2)) { | 1337 | if (hdr_len > (sizeof(struct cmd_desc_type0) - 2)) { |
1299 | first_hdr_len = sizeof(struct cmd_desc_type0) - 2; | 1338 | first_hdr_len = sizeof(struct cmd_desc_type0) - 2; |
1300 | more_hdr = 1; | 1339 | more_hdr = 1; |
@@ -1336,6 +1375,11 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1336 | netdev->trans_start = jiffies; | 1375 | netdev->trans_start = jiffies; |
1337 | 1376 | ||
1338 | return NETDEV_TX_OK; | 1377 | return NETDEV_TX_OK; |
1378 | |||
1379 | drop_packet: | ||
1380 | adapter->stats.txdropped++; | ||
1381 | dev_kfree_skb_any(skb); | ||
1382 | return NETDEV_TX_OK; | ||
1339 | } | 1383 | } |
1340 | 1384 | ||
1341 | static int netxen_nic_check_temp(struct netxen_adapter *adapter) | 1385 | static int netxen_nic_check_temp(struct netxen_adapter *adapter) |
@@ -1407,6 +1451,8 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter) | |||
1407 | netif_carrier_off(netdev); | 1451 | netif_carrier_off(netdev); |
1408 | netif_stop_queue(netdev); | 1452 | netif_stop_queue(netdev); |
1409 | } | 1453 | } |
1454 | |||
1455 | netxen_nic_set_link_parameters(adapter); | ||
1410 | } else if (!adapter->ahw.linkup && linkup) { | 1456 | } else if (!adapter->ahw.linkup && linkup) { |
1411 | printk(KERN_INFO "%s: %s NIC Link is up\n", | 1457 | printk(KERN_INFO "%s: %s NIC Link is up\n", |
1412 | netxen_nic_driver_name, netdev->name); | 1458 | netxen_nic_driver_name, netdev->name); |
@@ -1415,6 +1461,8 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter) | |||
1415 | netif_carrier_on(netdev); | 1461 | netif_carrier_on(netdev); |
1416 | netif_wake_queue(netdev); | 1462 | netif_wake_queue(netdev); |
1417 | } | 1463 | } |
1464 | |||
1465 | netxen_nic_set_link_parameters(adapter); | ||
1418 | } | 1466 | } |
1419 | } | 1467 | } |
1420 | 1468 | ||