diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/benet/be.h | 4 | ||||
-rw-r--r-- | drivers/net/benet/be_cmds.c | 30 | ||||
-rw-r--r-- | drivers/net/benet/be_cmds.h | 20 | ||||
-rw-r--r-- | drivers/net/benet/be_ethtool.c | 15 | ||||
-rw-r--r-- | drivers/net/benet/be_hw.h | 85 | ||||
-rw-r--r-- | drivers/net/benet/be_main.c | 229 | ||||
-rw-r--r-- | drivers/net/hydra.c | 4 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic.h | 97 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_ctx.c | 29 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_ethtool.c | 5 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_hdr.h | 23 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_hw.c | 238 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_init.c | 35 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 698 | ||||
-rw-r--r-- | drivers/net/niu.c | 23 | ||||
-rw-r--r-- | drivers/net/r8169.c | 1 | ||||
-rw-r--r-- | drivers/net/wan/dlci.c | 43 | ||||
-rw-r--r-- | drivers/net/wan/ixp4xx_hss.c | 95 | ||||
-rw-r--r-- | drivers/net/wan/pci200syn.c | 11 | ||||
-rw-r--r-- | drivers/net/wan/sdla.c | 8 |
20 files changed, 1176 insertions, 517 deletions
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h index 6c45a2233d0d..13b72ce870de 100644 --- a/drivers/net/benet/be.h +++ b/drivers/net/benet/be.h | |||
@@ -28,10 +28,11 @@ | |||
28 | #include <linux/if_vlan.h> | 28 | #include <linux/if_vlan.h> |
29 | #include <linux/workqueue.h> | 29 | #include <linux/workqueue.h> |
30 | #include <linux/interrupt.h> | 30 | #include <linux/interrupt.h> |
31 | #include <linux/firmware.h> | ||
31 | 32 | ||
32 | #include "be_hw.h" | 33 | #include "be_hw.h" |
33 | 34 | ||
34 | #define DRV_VER "2.0.400" | 35 | #define DRV_VER "2.101.205" |
35 | #define DRV_NAME "be2net" | 36 | #define DRV_NAME "be2net" |
36 | #define BE_NAME "ServerEngines BladeEngine2 10Gbps NIC" | 37 | #define BE_NAME "ServerEngines BladeEngine2 10Gbps NIC" |
37 | #define OC_NAME "Emulex OneConnect 10Gbps NIC" | 38 | #define OC_NAME "Emulex OneConnect 10Gbps NIC" |
@@ -361,4 +362,5 @@ static inline u8 is_udp_pkt(struct sk_buff *skb) | |||
361 | extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm, | 362 | extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm, |
362 | u16 num_popped); | 363 | u16 num_popped); |
363 | extern void be_link_status_update(struct be_adapter *adapter, bool link_up); | 364 | extern void be_link_status_update(struct be_adapter *adapter, bool link_up); |
365 | extern int be_load_fw(struct be_adapter *adapter, u8 *func); | ||
364 | #endif /* BE_H */ | 366 | #endif /* BE_H */ |
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c index 2547ee296a7d..1db092498309 100644 --- a/drivers/net/benet/be_cmds.c +++ b/drivers/net/benet/be_cmds.c | |||
@@ -155,7 +155,7 @@ static int be_mbox_db_ready_wait(struct be_adapter *adapter, void __iomem *db) | |||
155 | if (ready) | 155 | if (ready) |
156 | break; | 156 | break; |
157 | 157 | ||
158 | if (cnt > 200000) { | 158 | if (cnt > 4000000) { |
159 | dev_err(&adapter->pdev->dev, "mbox poll timed out\n"); | 159 | dev_err(&adapter->pdev->dev, "mbox poll timed out\n"); |
160 | return -1; | 160 | return -1; |
161 | } | 161 | } |
@@ -1040,3 +1040,31 @@ int be_cmd_reset_function(struct be_adapter *adapter) | |||
1040 | spin_unlock(&adapter->mbox_lock); | 1040 | spin_unlock(&adapter->mbox_lock); |
1041 | return status; | 1041 | return status; |
1042 | } | 1042 | } |
1043 | |||
1044 | int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd, | ||
1045 | u32 flash_type, u32 flash_opcode, u32 buf_size) | ||
1046 | { | ||
1047 | struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); | ||
1048 | struct be_cmd_write_flashrom *req = cmd->va; | ||
1049 | struct be_sge *sge = nonembedded_sgl(wrb); | ||
1050 | int status; | ||
1051 | |||
1052 | spin_lock(&adapter->mbox_lock); | ||
1053 | memset(wrb, 0, sizeof(*wrb)); | ||
1054 | be_wrb_hdr_prepare(wrb, cmd->size, false, 1); | ||
1055 | |||
1056 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, | ||
1057 | OPCODE_COMMON_WRITE_FLASHROM, cmd->size); | ||
1058 | sge->pa_hi = cpu_to_le32(upper_32_bits(cmd->dma)); | ||
1059 | sge->pa_lo = cpu_to_le32(cmd->dma & 0xFFFFFFFF); | ||
1060 | sge->len = cpu_to_le32(cmd->size); | ||
1061 | |||
1062 | req->params.op_type = cpu_to_le32(flash_type); | ||
1063 | req->params.op_code = cpu_to_le32(flash_opcode); | ||
1064 | req->params.data_buf_size = cpu_to_le32(buf_size); | ||
1065 | |||
1066 | status = be_mbox_notify(adapter); | ||
1067 | |||
1068 | spin_unlock(&adapter->mbox_lock); | ||
1069 | return status; | ||
1070 | } | ||
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index 70618064ae15..fd7028e5b78e 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
@@ -117,6 +117,7 @@ struct be_mcc_mailbox { | |||
117 | #define OPCODE_COMMON_NTWK_MULTICAST_SET 3 | 117 | #define OPCODE_COMMON_NTWK_MULTICAST_SET 3 |
118 | #define OPCODE_COMMON_NTWK_VLAN_CONFIG 4 | 118 | #define OPCODE_COMMON_NTWK_VLAN_CONFIG 4 |
119 | #define OPCODE_COMMON_NTWK_LINK_STATUS_QUERY 5 | 119 | #define OPCODE_COMMON_NTWK_LINK_STATUS_QUERY 5 |
120 | #define OPCODE_COMMON_WRITE_FLASHROM 7 | ||
120 | #define OPCODE_COMMON_CQ_CREATE 12 | 121 | #define OPCODE_COMMON_CQ_CREATE 12 |
121 | #define OPCODE_COMMON_EQ_CREATE 13 | 122 | #define OPCODE_COMMON_EQ_CREATE 13 |
122 | #define OPCODE_COMMON_MCC_CREATE 21 | 123 | #define OPCODE_COMMON_MCC_CREATE 21 |
@@ -693,10 +694,24 @@ struct be_cmd_resp_query_fw_cfg { | |||
693 | u32 be_config_number; | 694 | u32 be_config_number; |
694 | u32 asic_revision; | 695 | u32 asic_revision; |
695 | u32 phys_port; | 696 | u32 phys_port; |
696 | u32 function_mode; | 697 | u32 function_cap; |
697 | u32 rsvd[26]; | 698 | u32 rsvd[26]; |
698 | }; | 699 | }; |
699 | 700 | ||
701 | /****************** Firmware Flash ******************/ | ||
702 | struct flashrom_params { | ||
703 | u32 op_code; | ||
704 | u32 op_type; | ||
705 | u32 data_buf_size; | ||
706 | u32 offset; | ||
707 | u8 data_buf[4]; | ||
708 | }; | ||
709 | |||
710 | struct be_cmd_write_flashrom { | ||
711 | struct be_cmd_req_hdr hdr; | ||
712 | struct flashrom_params params; | ||
713 | }; | ||
714 | |||
700 | extern int be_pci_fnum_get(struct be_adapter *adapter); | 715 | extern int be_pci_fnum_get(struct be_adapter *adapter); |
701 | extern int be_cmd_POST(struct be_adapter *adapter); | 716 | extern int be_cmd_POST(struct be_adapter *adapter); |
702 | extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, | 717 | extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, |
@@ -747,3 +762,6 @@ extern int be_cmd_get_flow_control(struct be_adapter *adapter, | |||
747 | extern int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num); | 762 | extern int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num); |
748 | extern int be_cmd_reset_function(struct be_adapter *adapter); | 763 | extern int be_cmd_reset_function(struct be_adapter *adapter); |
749 | extern void be_process_mcc(struct be_adapter *adapter); | 764 | extern void be_process_mcc(struct be_adapter *adapter); |
765 | extern int be_cmd_write_flashrom(struct be_adapter *adapter, | ||
766 | struct be_dma_mem *cmd, u32 flash_oper, | ||
767 | u32 flash_opcode, u32 buf_size); | ||
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c index 4ff3cc465406..11445df3dbc0 100644 --- a/drivers/net/benet/be_ethtool.c +++ b/drivers/net/benet/be_ethtool.c | |||
@@ -332,6 +332,20 @@ be_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd) | |||
332 | return status; | 332 | return status; |
333 | } | 333 | } |
334 | 334 | ||
335 | static int | ||
336 | be_do_flash(struct net_device *netdev, struct ethtool_flash *efl) | ||
337 | { | ||
338 | struct be_adapter *adapter = netdev_priv(netdev); | ||
339 | char file_name[ETHTOOL_FLASH_MAX_FILENAME]; | ||
340 | u32 region; | ||
341 | |||
342 | file_name[ETHTOOL_FLASH_MAX_FILENAME - 1] = 0; | ||
343 | strcpy(file_name, efl->data); | ||
344 | region = efl->region; | ||
345 | |||
346 | return be_load_fw(adapter, file_name); | ||
347 | } | ||
348 | |||
335 | const struct ethtool_ops be_ethtool_ops = { | 349 | const struct ethtool_ops be_ethtool_ops = { |
336 | .get_settings = be_get_settings, | 350 | .get_settings = be_get_settings, |
337 | .get_drvinfo = be_get_drvinfo, | 351 | .get_drvinfo = be_get_drvinfo, |
@@ -352,4 +366,5 @@ const struct ethtool_ops be_ethtool_ops = { | |||
352 | .get_strings = be_get_stat_strings, | 366 | .get_strings = be_get_stat_strings, |
353 | .get_stats_count = be_get_stats_count, | 367 | .get_stats_count = be_get_stats_count, |
354 | .get_ethtool_stats = be_get_ethtool_stats, | 368 | .get_ethtool_stats = be_get_ethtool_stats, |
369 | .flash_device = be_do_flash, | ||
355 | }; | 370 | }; |
diff --git a/drivers/net/benet/be_hw.h b/drivers/net/benet/be_hw.h index d28f0c679bc8..a3394b4aa14a 100644 --- a/drivers/net/benet/be_hw.h +++ b/drivers/net/benet/be_hw.h | |||
@@ -204,7 +204,7 @@ struct amap_eth_rx_compl { | |||
204 | u8 numfrags[3]; /* dword 1 */ | 204 | u8 numfrags[3]; /* dword 1 */ |
205 | u8 rss_flush; /* dword 2 */ | 205 | u8 rss_flush; /* dword 2 */ |
206 | u8 cast_enc[2]; /* dword 2 */ | 206 | u8 cast_enc[2]; /* dword 2 */ |
207 | u8 qnq; /* dword 2 */ | 207 | u8 vtm; /* dword 2 */ |
208 | u8 rss_bank; /* dword 2 */ | 208 | u8 rss_bank; /* dword 2 */ |
209 | u8 rsvd1[23]; /* dword 2 */ | 209 | u8 rsvd1[23]; /* dword 2 */ |
210 | u8 lro_pkt; /* dword 2 */ | 210 | u8 lro_pkt; /* dword 2 */ |
@@ -216,3 +216,86 @@ struct amap_eth_rx_compl { | |||
216 | struct be_eth_rx_compl { | 216 | struct be_eth_rx_compl { |
217 | u32 dw[4]; | 217 | u32 dw[4]; |
218 | }; | 218 | }; |
219 | |||
220 | /* Flashrom related descriptors */ | ||
221 | #define IMAGE_TYPE_FIRMWARE 160 | ||
222 | #define IMAGE_TYPE_BOOTCODE 224 | ||
223 | #define IMAGE_TYPE_OPTIONROM 32 | ||
224 | |||
225 | #define NUM_FLASHDIR_ENTRIES 32 | ||
226 | |||
227 | #define FLASHROM_TYPE_ISCSI_ACTIVE 0 | ||
228 | #define FLASHROM_TYPE_BIOS 2 | ||
229 | #define FLASHROM_TYPE_PXE_BIOS 3 | ||
230 | #define FLASHROM_TYPE_FCOE_BIOS 8 | ||
231 | #define FLASHROM_TYPE_ISCSI_BACKUP 9 | ||
232 | #define FLASHROM_TYPE_FCOE_FW_ACTIVE 10 | ||
233 | #define FLASHROM_TYPE_FCOE_FW_BACKUP 11 | ||
234 | |||
235 | #define FLASHROM_OPER_FLASH 1 | ||
236 | #define FLASHROM_OPER_SAVE 2 | ||
237 | |||
238 | #define FLASH_IMAGE_MAX_SIZE (1310720) /* Max firmware image size */ | ||
239 | #define FLASH_BIOS_IMAGE_MAX_SIZE (262144) /* Max OPTION ROM image sz */ | ||
240 | |||
241 | /* Offsets for components on Flash. */ | ||
242 | #define FLASH_iSCSI_PRIMARY_IMAGE_START (1048576) | ||
243 | #define FLASH_iSCSI_BACKUP_IMAGE_START (2359296) | ||
244 | #define FLASH_FCoE_PRIMARY_IMAGE_START (3670016) | ||
245 | #define FLASH_FCoE_BACKUP_IMAGE_START (4980736) | ||
246 | #define FLASH_iSCSI_BIOS_START (7340032) | ||
247 | #define FLASH_PXE_BIOS_START (7864320) | ||
248 | #define FLASH_FCoE_BIOS_START (524288) | ||
249 | |||
250 | struct controller_id { | ||
251 | u32 vendor; | ||
252 | u32 device; | ||
253 | u32 subvendor; | ||
254 | u32 subdevice; | ||
255 | }; | ||
256 | |||
257 | struct flash_file_hdr { | ||
258 | u8 sign[32]; | ||
259 | u32 cksum; | ||
260 | u32 antidote; | ||
261 | struct controller_id cont_id; | ||
262 | u32 file_len; | ||
263 | u32 chunk_num; | ||
264 | u32 total_chunks; | ||
265 | u32 num_imgs; | ||
266 | u8 build[24]; | ||
267 | }; | ||
268 | |||
269 | struct flash_section_hdr { | ||
270 | u32 format_rev; | ||
271 | u32 cksum; | ||
272 | u32 antidote; | ||
273 | u32 build_no; | ||
274 | u8 id_string[64]; | ||
275 | u32 active_entry_mask; | ||
276 | u32 valid_entry_mask; | ||
277 | u32 org_content_mask; | ||
278 | u32 rsvd0; | ||
279 | u32 rsvd1; | ||
280 | u32 rsvd2; | ||
281 | u32 rsvd3; | ||
282 | u32 rsvd4; | ||
283 | }; | ||
284 | |||
285 | struct flash_section_entry { | ||
286 | u32 type; | ||
287 | u32 offset; | ||
288 | u32 pad_size; | ||
289 | u32 image_size; | ||
290 | u32 cksum; | ||
291 | u32 entry_point; | ||
292 | u32 rsvd0; | ||
293 | u32 rsvd1; | ||
294 | u8 ver_data[32]; | ||
295 | }; | ||
296 | |||
297 | struct flash_section_info { | ||
298 | u8 cookie[32]; | ||
299 | struct flash_section_hdr fsec_hdr; | ||
300 | struct flash_section_entry fsec_entry[32]; | ||
301 | }; | ||
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index bac85f950394..ce11bba2cb67 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
@@ -385,15 +385,19 @@ static int make_tx_wrbs(struct be_adapter *adapter, | |||
385 | struct be_eth_wrb *wrb; | 385 | struct be_eth_wrb *wrb; |
386 | struct be_eth_hdr_wrb *hdr; | 386 | struct be_eth_hdr_wrb *hdr; |
387 | 387 | ||
388 | atomic_add(wrb_cnt, &txq->used); | ||
389 | hdr = queue_head_node(txq); | 388 | hdr = queue_head_node(txq); |
389 | atomic_add(wrb_cnt, &txq->used); | ||
390 | queue_head_inc(txq); | 390 | queue_head_inc(txq); |
391 | 391 | ||
392 | if (skb_dma_map(&pdev->dev, skb, DMA_TO_DEVICE)) { | ||
393 | dev_err(&pdev->dev, "TX DMA mapping failed\n"); | ||
394 | return 0; | ||
395 | } | ||
396 | |||
392 | if (skb->len > skb->data_len) { | 397 | if (skb->len > skb->data_len) { |
393 | int len = skb->len - skb->data_len; | 398 | int len = skb->len - skb->data_len; |
394 | busaddr = pci_map_single(pdev, skb->data, len, | ||
395 | PCI_DMA_TODEVICE); | ||
396 | wrb = queue_head_node(txq); | 399 | wrb = queue_head_node(txq); |
400 | busaddr = skb_shinfo(skb)->dma_head; | ||
397 | wrb_fill(wrb, busaddr, len); | 401 | wrb_fill(wrb, busaddr, len); |
398 | be_dws_cpu_to_le(wrb, sizeof(*wrb)); | 402 | be_dws_cpu_to_le(wrb, sizeof(*wrb)); |
399 | queue_head_inc(txq); | 403 | queue_head_inc(txq); |
@@ -403,9 +407,8 @@ static int make_tx_wrbs(struct be_adapter *adapter, | |||
403 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 407 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
404 | struct skb_frag_struct *frag = | 408 | struct skb_frag_struct *frag = |
405 | &skb_shinfo(skb)->frags[i]; | 409 | &skb_shinfo(skb)->frags[i]; |
406 | busaddr = pci_map_page(pdev, frag->page, | 410 | |
407 | frag->page_offset, | 411 | busaddr = skb_shinfo(skb)->dma_maps[i]; |
408 | frag->size, PCI_DMA_TODEVICE); | ||
409 | wrb = queue_head_node(txq); | 412 | wrb = queue_head_node(txq); |
410 | wrb_fill(wrb, busaddr, frag->size); | 413 | wrb_fill(wrb, busaddr, frag->size); |
411 | be_dws_cpu_to_le(wrb, sizeof(*wrb)); | 414 | be_dws_cpu_to_le(wrb, sizeof(*wrb)); |
@@ -429,6 +432,7 @@ static int make_tx_wrbs(struct be_adapter *adapter, | |||
429 | 432 | ||
430 | static netdev_tx_t be_xmit(struct sk_buff *skb, | 433 | static netdev_tx_t be_xmit(struct sk_buff *skb, |
431 | struct net_device *netdev) | 434 | struct net_device *netdev) |
435 | |||
432 | { | 436 | { |
433 | struct be_adapter *adapter = netdev_priv(netdev); | 437 | struct be_adapter *adapter = netdev_priv(netdev); |
434 | struct be_tx_obj *tx_obj = &adapter->tx_obj; | 438 | struct be_tx_obj *tx_obj = &adapter->tx_obj; |
@@ -440,23 +444,28 @@ static netdev_tx_t be_xmit(struct sk_buff *skb, | |||
440 | wrb_cnt = wrb_cnt_for_skb(skb, &dummy_wrb); | 444 | wrb_cnt = wrb_cnt_for_skb(skb, &dummy_wrb); |
441 | 445 | ||
442 | copied = make_tx_wrbs(adapter, skb, wrb_cnt, dummy_wrb); | 446 | copied = make_tx_wrbs(adapter, skb, wrb_cnt, dummy_wrb); |
447 | if (copied) { | ||
448 | /* record the sent skb in the sent_skb table */ | ||
449 | BUG_ON(tx_obj->sent_skb_list[start]); | ||
450 | tx_obj->sent_skb_list[start] = skb; | ||
451 | |||
452 | /* Ensure txq has space for the next skb; Else stop the queue | ||
453 | * *BEFORE* ringing the tx doorbell, so that we serialze the | ||
454 | * tx compls of the current transmit which'll wake up the queue | ||
455 | */ | ||
456 | if ((BE_MAX_TX_FRAG_COUNT + atomic_read(&txq->used)) >= | ||
457 | txq->len) { | ||
458 | netif_stop_queue(netdev); | ||
459 | stopped = true; | ||
460 | } | ||
443 | 461 | ||
444 | /* record the sent skb in the sent_skb table */ | 462 | be_txq_notify(adapter, txq->id, wrb_cnt); |
445 | BUG_ON(tx_obj->sent_skb_list[start]); | ||
446 | tx_obj->sent_skb_list[start] = skb; | ||
447 | 463 | ||
448 | /* Ensure that txq has space for the next skb; Else stop the queue | 464 | be_tx_stats_update(adapter, wrb_cnt, copied, stopped); |
449 | * *BEFORE* ringing the tx doorbell, so that we serialze the | 465 | } else { |
450 | * tx compls of the current transmit which'll wake up the queue | 466 | txq->head = start; |
451 | */ | 467 | dev_kfree_skb_any(skb); |
452 | if ((BE_MAX_TX_FRAG_COUNT + atomic_read(&txq->used)) >= txq->len) { | ||
453 | netif_stop_queue(netdev); | ||
454 | stopped = true; | ||
455 | } | 468 | } |
456 | |||
457 | be_txq_notify(adapter, txq->id, wrb_cnt); | ||
458 | |||
459 | be_tx_stats_update(adapter, wrb_cnt, copied, stopped); | ||
460 | return NETDEV_TX_OK; | 469 | return NETDEV_TX_OK; |
461 | } | 470 | } |
462 | 471 | ||
@@ -958,10 +967,8 @@ static struct be_eth_tx_compl *be_tx_compl_get(struct be_queue_info *tx_cq) | |||
958 | static void be_tx_compl_process(struct be_adapter *adapter, u16 last_index) | 967 | static void be_tx_compl_process(struct be_adapter *adapter, u16 last_index) |
959 | { | 968 | { |
960 | struct be_queue_info *txq = &adapter->tx_obj.q; | 969 | struct be_queue_info *txq = &adapter->tx_obj.q; |
961 | struct be_eth_wrb *wrb; | ||
962 | struct sk_buff **sent_skbs = adapter->tx_obj.sent_skb_list; | 970 | struct sk_buff **sent_skbs = adapter->tx_obj.sent_skb_list; |
963 | struct sk_buff *sent_skb; | 971 | struct sk_buff *sent_skb; |
964 | u64 busaddr; | ||
965 | u16 cur_index, num_wrbs = 0; | 972 | u16 cur_index, num_wrbs = 0; |
966 | 973 | ||
967 | cur_index = txq->tail; | 974 | cur_index = txq->tail; |
@@ -971,19 +978,12 @@ static void be_tx_compl_process(struct be_adapter *adapter, u16 last_index) | |||
971 | 978 | ||
972 | do { | 979 | do { |
973 | cur_index = txq->tail; | 980 | cur_index = txq->tail; |
974 | wrb = queue_tail_node(txq); | ||
975 | be_dws_le_to_cpu(wrb, sizeof(*wrb)); | ||
976 | busaddr = ((u64)wrb->frag_pa_hi << 32) | (u64)wrb->frag_pa_lo; | ||
977 | if (busaddr != 0) { | ||
978 | pci_unmap_single(adapter->pdev, busaddr, | ||
979 | wrb->frag_len, PCI_DMA_TODEVICE); | ||
980 | } | ||
981 | num_wrbs++; | 981 | num_wrbs++; |
982 | queue_tail_inc(txq); | 982 | queue_tail_inc(txq); |
983 | } while (cur_index != last_index); | 983 | } while (cur_index != last_index); |
984 | 984 | ||
985 | atomic_sub(num_wrbs, &txq->used); | 985 | atomic_sub(num_wrbs, &txq->used); |
986 | 986 | skb_dma_unmap(&adapter->pdev->dev, sent_skb, DMA_TO_DEVICE); | |
987 | kfree_skb(sent_skb); | 987 | kfree_skb(sent_skb); |
988 | } | 988 | } |
989 | 989 | ||
@@ -1699,6 +1699,173 @@ static int be_close(struct net_device *netdev) | |||
1699 | return 0; | 1699 | return 0; |
1700 | } | 1700 | } |
1701 | 1701 | ||
1702 | #define FW_FILE_HDR_SIGN "ServerEngines Corp. " | ||
1703 | char flash_cookie[2][16] = {"*** SE FLAS", | ||
1704 | "H DIRECTORY *** "}; | ||
1705 | static int be_flash_image(struct be_adapter *adapter, | ||
1706 | const struct firmware *fw, | ||
1707 | struct be_dma_mem *flash_cmd, u32 flash_type) | ||
1708 | { | ||
1709 | int status; | ||
1710 | u32 flash_op, image_offset = 0, total_bytes, image_size = 0; | ||
1711 | int num_bytes; | ||
1712 | const u8 *p = fw->data; | ||
1713 | struct be_cmd_write_flashrom *req = flash_cmd->va; | ||
1714 | |||
1715 | switch (flash_type) { | ||
1716 | case FLASHROM_TYPE_ISCSI_ACTIVE: | ||
1717 | image_offset = FLASH_iSCSI_PRIMARY_IMAGE_START; | ||
1718 | image_size = FLASH_IMAGE_MAX_SIZE; | ||
1719 | break; | ||
1720 | case FLASHROM_TYPE_ISCSI_BACKUP: | ||
1721 | image_offset = FLASH_iSCSI_BACKUP_IMAGE_START; | ||
1722 | image_size = FLASH_IMAGE_MAX_SIZE; | ||
1723 | break; | ||
1724 | case FLASHROM_TYPE_FCOE_FW_ACTIVE: | ||
1725 | image_offset = FLASH_FCoE_PRIMARY_IMAGE_START; | ||
1726 | image_size = FLASH_IMAGE_MAX_SIZE; | ||
1727 | break; | ||
1728 | case FLASHROM_TYPE_FCOE_FW_BACKUP: | ||
1729 | image_offset = FLASH_FCoE_BACKUP_IMAGE_START; | ||
1730 | image_size = FLASH_IMAGE_MAX_SIZE; | ||
1731 | break; | ||
1732 | case FLASHROM_TYPE_BIOS: | ||
1733 | image_offset = FLASH_iSCSI_BIOS_START; | ||
1734 | image_size = FLASH_BIOS_IMAGE_MAX_SIZE; | ||
1735 | break; | ||
1736 | case FLASHROM_TYPE_FCOE_BIOS: | ||
1737 | image_offset = FLASH_FCoE_BIOS_START; | ||
1738 | image_size = FLASH_BIOS_IMAGE_MAX_SIZE; | ||
1739 | break; | ||
1740 | case FLASHROM_TYPE_PXE_BIOS: | ||
1741 | image_offset = FLASH_PXE_BIOS_START; | ||
1742 | image_size = FLASH_BIOS_IMAGE_MAX_SIZE; | ||
1743 | break; | ||
1744 | default: | ||
1745 | return 0; | ||
1746 | } | ||
1747 | |||
1748 | p += sizeof(struct flash_file_hdr) + image_offset; | ||
1749 | if (p + image_size > fw->data + fw->size) | ||
1750 | return -1; | ||
1751 | |||
1752 | total_bytes = image_size; | ||
1753 | |||
1754 | while (total_bytes) { | ||
1755 | if (total_bytes > 32*1024) | ||
1756 | num_bytes = 32*1024; | ||
1757 | else | ||
1758 | num_bytes = total_bytes; | ||
1759 | total_bytes -= num_bytes; | ||
1760 | |||
1761 | if (!total_bytes) | ||
1762 | flash_op = FLASHROM_OPER_FLASH; | ||
1763 | else | ||
1764 | flash_op = FLASHROM_OPER_SAVE; | ||
1765 | memcpy(req->params.data_buf, p, num_bytes); | ||
1766 | p += num_bytes; | ||
1767 | status = be_cmd_write_flashrom(adapter, flash_cmd, | ||
1768 | flash_type, flash_op, num_bytes); | ||
1769 | if (status) { | ||
1770 | dev_err(&adapter->pdev->dev, | ||
1771 | "cmd to write to flash rom failed. type/op %d/%d\n", | ||
1772 | flash_type, flash_op); | ||
1773 | return -1; | ||
1774 | } | ||
1775 | yield(); | ||
1776 | } | ||
1777 | |||
1778 | return 0; | ||
1779 | } | ||
1780 | |||
1781 | int be_load_fw(struct be_adapter *adapter, u8 *func) | ||
1782 | { | ||
1783 | char fw_file[ETHTOOL_FLASH_MAX_FILENAME]; | ||
1784 | const struct firmware *fw; | ||
1785 | struct flash_file_hdr *fhdr; | ||
1786 | struct flash_section_info *fsec = NULL; | ||
1787 | struct be_dma_mem flash_cmd; | ||
1788 | int status; | ||
1789 | const u8 *p; | ||
1790 | bool entry_found = false; | ||
1791 | int flash_type; | ||
1792 | char fw_ver[FW_VER_LEN]; | ||
1793 | char fw_cfg; | ||
1794 | |||
1795 | status = be_cmd_get_fw_ver(adapter, fw_ver); | ||
1796 | if (status) | ||
1797 | return status; | ||
1798 | |||
1799 | fw_cfg = *(fw_ver + 2); | ||
1800 | if (fw_cfg == '0') | ||
1801 | fw_cfg = '1'; | ||
1802 | strcpy(fw_file, func); | ||
1803 | |||
1804 | status = request_firmware(&fw, fw_file, &adapter->pdev->dev); | ||
1805 | if (status) | ||
1806 | goto fw_exit; | ||
1807 | |||
1808 | p = fw->data; | ||
1809 | fhdr = (struct flash_file_hdr *) p; | ||
1810 | if (memcmp(fhdr->sign, FW_FILE_HDR_SIGN, strlen(FW_FILE_HDR_SIGN))) { | ||
1811 | dev_err(&adapter->pdev->dev, | ||
1812 | "Firmware(%s) load error (signature did not match)\n", | ||
1813 | fw_file); | ||
1814 | status = -1; | ||
1815 | goto fw_exit; | ||
1816 | } | ||
1817 | |||
1818 | dev_info(&adapter->pdev->dev, "Flashing firmware file %s\n", fw_file); | ||
1819 | |||
1820 | p += sizeof(struct flash_file_hdr); | ||
1821 | while (p < (fw->data + fw->size)) { | ||
1822 | fsec = (struct flash_section_info *)p; | ||
1823 | if (!memcmp(flash_cookie, fsec->cookie, sizeof(flash_cookie))) { | ||
1824 | entry_found = true; | ||
1825 | break; | ||
1826 | } | ||
1827 | p += 32; | ||
1828 | } | ||
1829 | |||
1830 | if (!entry_found) { | ||
1831 | status = -1; | ||
1832 | dev_err(&adapter->pdev->dev, | ||
1833 | "Flash cookie not found in firmware image\n"); | ||
1834 | goto fw_exit; | ||
1835 | } | ||
1836 | |||
1837 | flash_cmd.size = sizeof(struct be_cmd_write_flashrom) + 32*1024; | ||
1838 | flash_cmd.va = pci_alloc_consistent(adapter->pdev, flash_cmd.size, | ||
1839 | &flash_cmd.dma); | ||
1840 | if (!flash_cmd.va) { | ||
1841 | status = -ENOMEM; | ||
1842 | dev_err(&adapter->pdev->dev, | ||
1843 | "Memory allocation failure while flashing\n"); | ||
1844 | goto fw_exit; | ||
1845 | } | ||
1846 | |||
1847 | for (flash_type = FLASHROM_TYPE_ISCSI_ACTIVE; | ||
1848 | flash_type <= FLASHROM_TYPE_FCOE_FW_BACKUP; flash_type++) { | ||
1849 | status = be_flash_image(adapter, fw, &flash_cmd, | ||
1850 | flash_type); | ||
1851 | if (status) | ||
1852 | break; | ||
1853 | } | ||
1854 | |||
1855 | pci_free_consistent(adapter->pdev, flash_cmd.size, flash_cmd.va, | ||
1856 | flash_cmd.dma); | ||
1857 | if (status) { | ||
1858 | dev_err(&adapter->pdev->dev, "Firmware load error\n"); | ||
1859 | goto fw_exit; | ||
1860 | } | ||
1861 | |||
1862 | dev_info(&adapter->pdev->dev, "Firmware flashed succesfully\n"); | ||
1863 | |||
1864 | fw_exit: | ||
1865 | release_firmware(fw); | ||
1866 | return status; | ||
1867 | } | ||
1868 | |||
1702 | static struct net_device_ops be_netdev_ops = { | 1869 | static struct net_device_ops be_netdev_ops = { |
1703 | .ndo_open = be_open, | 1870 | .ndo_open = be_open, |
1704 | .ndo_stop = be_close, | 1871 | .ndo_stop = be_close, |
@@ -1725,6 +1892,8 @@ static void be_netdev_init(struct net_device *netdev) | |||
1725 | 1892 | ||
1726 | adapter->rx_csum = true; | 1893 | adapter->rx_csum = true; |
1727 | 1894 | ||
1895 | netif_set_gso_max_size(netdev, 65535); | ||
1896 | |||
1728 | BE_SET_NETDEV_OPS(netdev, &be_netdev_ops); | 1897 | BE_SET_NETDEV_OPS(netdev, &be_netdev_ops); |
1729 | 1898 | ||
1730 | SET_ETHTOOL_OPS(netdev, &be_ethtool_ops); | 1899 | SET_ETHTOOL_OPS(netdev, &be_ethtool_ops); |
diff --git a/drivers/net/hydra.c b/drivers/net/hydra.c index 8ac0930c183c..d496b6f4a478 100644 --- a/drivers/net/hydra.c +++ b/drivers/net/hydra.c | |||
@@ -173,9 +173,9 @@ static int __devinit hydra_init(struct zorro_dev *z) | |||
173 | 173 | ||
174 | zorro_set_drvdata(z, dev); | 174 | zorro_set_drvdata(z, dev); |
175 | 175 | ||
176 | printk(KERN_INFO "%s: Hydra at 0x%08lx, address " | 176 | printk(KERN_INFO "%s: Hydra at 0x%08llx, address " |
177 | "%pM (hydra.c " HYDRA_VERSION ")\n", | 177 | "%pM (hydra.c " HYDRA_VERSION ")\n", |
178 | dev->name, z->resource.start, dev->dev_addr); | 178 | dev->name, (unsigned long long)z->resource.start, dev->dev_addr); |
179 | 179 | ||
180 | return 0; | 180 | return 0; |
181 | } | 181 | } |
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index ede2fa7477ac..2a52479bcdf0 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h | |||
@@ -58,8 +58,8 @@ | |||
58 | 58 | ||
59 | #define _NETXEN_NIC_LINUX_MAJOR 4 | 59 | #define _NETXEN_NIC_LINUX_MAJOR 4 |
60 | #define _NETXEN_NIC_LINUX_MINOR 0 | 60 | #define _NETXEN_NIC_LINUX_MINOR 0 |
61 | #define _NETXEN_NIC_LINUX_SUBVERSION 41 | 61 | #define _NETXEN_NIC_LINUX_SUBVERSION 50 |
62 | #define NETXEN_NIC_LINUX_VERSIONID "4.0.41" | 62 | #define NETXEN_NIC_LINUX_VERSIONID "4.0.50" |
63 | 63 | ||
64 | #define NETXEN_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c)) | 64 | #define NETXEN_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c)) |
65 | #define _major(v) (((v) >> 24) & 0xff) | 65 | #define _major(v) (((v) >> 24) & 0xff) |
@@ -229,6 +229,8 @@ | |||
229 | #define MPORT_SINGLE_FUNCTION_MODE 0x1111 | 229 | #define MPORT_SINGLE_FUNCTION_MODE 0x1111 |
230 | #define MPORT_MULTI_FUNCTION_MODE 0x2222 | 230 | #define MPORT_MULTI_FUNCTION_MODE 0x2222 |
231 | 231 | ||
232 | #define NX_MAX_PCI_FUNC 8 | ||
233 | |||
232 | /* | 234 | /* |
233 | * NetXen host-peg signal message structure | 235 | * NetXen host-peg signal message structure |
234 | * | 236 | * |
@@ -582,11 +584,11 @@ struct netxen_adapter_stats { | |||
582 | */ | 584 | */ |
583 | struct nx_host_rds_ring { | 585 | struct nx_host_rds_ring { |
584 | u32 producer; | 586 | u32 producer; |
585 | u32 crb_rcv_producer; | ||
586 | u32 num_desc; | 587 | u32 num_desc; |
587 | u32 dma_size; | 588 | u32 dma_size; |
588 | u32 skb_size; | 589 | u32 skb_size; |
589 | u32 flags; | 590 | u32 flags; |
591 | void __iomem *crb_rcv_producer; | ||
590 | struct rcv_desc *desc_head; | 592 | struct rcv_desc *desc_head; |
591 | struct netxen_rx_buffer *rx_buf_arr; | 593 | struct netxen_rx_buffer *rx_buf_arr; |
592 | struct list_head free_list; | 594 | struct list_head free_list; |
@@ -596,9 +598,9 @@ struct nx_host_rds_ring { | |||
596 | 598 | ||
597 | struct nx_host_sds_ring { | 599 | struct nx_host_sds_ring { |
598 | u32 consumer; | 600 | u32 consumer; |
599 | u32 crb_sts_consumer; | ||
600 | u32 crb_intr_mask; | ||
601 | u32 num_desc; | 601 | u32 num_desc; |
602 | void __iomem *crb_sts_consumer; | ||
603 | void __iomem *crb_intr_mask; | ||
602 | 604 | ||
603 | struct status_desc *desc_head; | 605 | struct status_desc *desc_head; |
604 | struct netxen_adapter *adapter; | 606 | struct netxen_adapter *adapter; |
@@ -615,8 +617,8 @@ struct nx_host_tx_ring { | |||
615 | u32 producer; | 617 | u32 producer; |
616 | __le32 *hw_consumer; | 618 | __le32 *hw_consumer; |
617 | u32 sw_consumer; | 619 | u32 sw_consumer; |
618 | u32 crb_cmd_producer; | 620 | void __iomem *crb_cmd_producer; |
619 | u32 crb_cmd_consumer; | 621 | void __iomem *crb_cmd_consumer; |
620 | u32 num_desc; | 622 | u32 num_desc; |
621 | 623 | ||
622 | struct netdev_queue *txq; | 624 | struct netdev_queue *txq; |
@@ -1101,6 +1103,10 @@ typedef struct { | |||
1101 | #define NETXEN_ADAPTER_UP_MAGIC 777 | 1103 | #define NETXEN_ADAPTER_UP_MAGIC 777 |
1102 | #define NETXEN_NIC_PEG_TUNE 0 | 1104 | #define NETXEN_NIC_PEG_TUNE 0 |
1103 | 1105 | ||
1106 | #define __NX_FW_ATTACHED 0 | ||
1107 | #define __NX_DEV_UP 1 | ||
1108 | #define __NX_RESETTING 2 | ||
1109 | |||
1104 | struct netxen_dummy_dma { | 1110 | struct netxen_dummy_dma { |
1105 | void *addr; | 1111 | void *addr; |
1106 | dma_addr_t phys_addr; | 1112 | dma_addr_t phys_addr; |
@@ -1137,7 +1143,9 @@ struct netxen_adapter { | |||
1137 | u8 max_mc_count; | 1143 | u8 max_mc_count; |
1138 | u8 rss_supported; | 1144 | u8 rss_supported; |
1139 | u8 link_changed; | 1145 | u8 link_changed; |
1140 | u32 resv3; | 1146 | u8 fw_wait_cnt; |
1147 | u8 fw_fail_cnt; | ||
1148 | u16 resv4; | ||
1141 | 1149 | ||
1142 | u8 has_link_events; | 1150 | u8 has_link_events; |
1143 | u8 fw_type; | 1151 | u8 fw_type; |
@@ -1155,8 +1163,8 @@ struct netxen_adapter { | |||
1155 | u32 irq; | 1163 | u32 irq; |
1156 | u32 temp; | 1164 | u32 temp; |
1157 | 1165 | ||
1158 | u32 msi_tgt_status; | 1166 | u32 int_vec_bit; |
1159 | u32 resv4; | 1167 | u32 heartbit; |
1160 | 1168 | ||
1161 | struct netxen_adapter_stats stats; | 1169 | struct netxen_adapter_stats stats; |
1162 | 1170 | ||
@@ -1172,29 +1180,37 @@ struct netxen_adapter { | |||
1172 | int (*init_port) (struct netxen_adapter *, int); | 1180 | int (*init_port) (struct netxen_adapter *, int); |
1173 | int (*stop_port) (struct netxen_adapter *); | 1181 | int (*stop_port) (struct netxen_adapter *); |
1174 | 1182 | ||
1175 | u32 (*hw_read_wx)(struct netxen_adapter *, ulong); | 1183 | u32 (*crb_read)(struct netxen_adapter *, ulong); |
1176 | int (*hw_write_wx)(struct netxen_adapter *, ulong, u32); | 1184 | int (*crb_write)(struct netxen_adapter *, ulong, u32); |
1185 | |||
1177 | int (*pci_mem_read)(struct netxen_adapter *, u64, void *, int); | 1186 | int (*pci_mem_read)(struct netxen_adapter *, u64, void *, int); |
1178 | int (*pci_mem_write)(struct netxen_adapter *, u64, void *, int); | 1187 | int (*pci_mem_write)(struct netxen_adapter *, u64, void *, int); |
1179 | int (*pci_write_immediate)(struct netxen_adapter *, u64, u32); | 1188 | |
1180 | u32 (*pci_read_immediate)(struct netxen_adapter *, u64); | ||
1181 | unsigned long (*pci_set_window)(struct netxen_adapter *, | 1189 | unsigned long (*pci_set_window)(struct netxen_adapter *, |
1182 | unsigned long long); | 1190 | unsigned long long); |
1183 | 1191 | ||
1184 | struct netxen_legacy_intr_set legacy_intr; | 1192 | u32 (*io_read)(struct netxen_adapter *, void __iomem *); |
1193 | void (*io_write)(struct netxen_adapter *, void __iomem *, u32); | ||
1194 | |||
1195 | void __iomem *tgt_mask_reg; | ||
1196 | void __iomem *pci_int_reg; | ||
1197 | void __iomem *tgt_status_reg; | ||
1198 | void __iomem *crb_int_state_reg; | ||
1199 | void __iomem *isr_int_vec; | ||
1185 | 1200 | ||
1186 | struct msix_entry msix_entries[MSIX_ENTRIES_PER_ADAPTER]; | 1201 | struct msix_entry msix_entries[MSIX_ENTRIES_PER_ADAPTER]; |
1187 | 1202 | ||
1188 | struct netxen_dummy_dma dummy_dma; | 1203 | struct netxen_dummy_dma dummy_dma; |
1189 | 1204 | ||
1190 | struct work_struct watchdog_task; | 1205 | struct delayed_work fw_work; |
1191 | struct timer_list watchdog_timer; | 1206 | |
1192 | struct work_struct tx_timeout_task; | 1207 | struct work_struct tx_timeout_task; |
1193 | 1208 | ||
1194 | struct net_device_stats net_stats; | 1209 | struct net_device_stats net_stats; |
1195 | 1210 | ||
1196 | nx_nic_intr_coalesce_t coal; | 1211 | nx_nic_intr_coalesce_t coal; |
1197 | 1212 | ||
1213 | unsigned long state; | ||
1198 | u32 resv5; | 1214 | u32 resv5; |
1199 | u32 fw_version; | 1215 | u32 fw_version; |
1200 | const struct firmware *fw; | 1216 | const struct firmware *fw; |
@@ -1214,9 +1230,13 @@ int netxen_p2_nic_set_mac_addr(struct netxen_adapter *adapter, u8 *addr); | |||
1214 | int netxen_p3_nic_set_mac_addr(struct netxen_adapter *adapter, u8 *addr); | 1230 | int netxen_p3_nic_set_mac_addr(struct netxen_adapter *adapter, u8 *addr); |
1215 | 1231 | ||
1216 | #define NXRD32(adapter, off) \ | 1232 | #define NXRD32(adapter, off) \ |
1217 | (adapter->hw_read_wx(adapter, off)) | 1233 | (adapter->crb_read(adapter, off)) |
1218 | #define NXWR32(adapter, off, val) \ | 1234 | #define NXWR32(adapter, off, val) \ |
1219 | (adapter->hw_write_wx(adapter, off, val)) | 1235 | (adapter->crb_write(adapter, off, val)) |
1236 | #define NXRDIO(adapter, addr) \ | ||
1237 | (adapter->io_read(adapter, addr)) | ||
1238 | #define NXWRIO(adapter, addr, val) \ | ||
1239 | (adapter->io_write(adapter, addr, val)) | ||
1220 | 1240 | ||
1221 | int netxen_pcie_sem_lock(struct netxen_adapter *, int, u32); | 1241 | int netxen_pcie_sem_lock(struct netxen_adapter *, int, u32); |
1222 | void netxen_pcie_sem_unlock(struct netxen_adapter *, int); | 1242 | void netxen_pcie_sem_unlock(struct netxen_adapter *, int); |
@@ -1243,43 +1263,8 @@ void netxen_pcie_sem_unlock(struct netxen_adapter *, int); | |||
1243 | netxen_pcie_sem_unlock((a), 7) | 1263 | netxen_pcie_sem_unlock((a), 7) |
1244 | 1264 | ||
1245 | int netxen_nic_get_board_info(struct netxen_adapter *adapter); | 1265 | int netxen_nic_get_board_info(struct netxen_adapter *adapter); |
1246 | void netxen_nic_get_firmware_info(struct netxen_adapter *adapter); | ||
1247 | int netxen_nic_wol_supported(struct netxen_adapter *adapter); | 1266 | int netxen_nic_wol_supported(struct netxen_adapter *adapter); |
1248 | 1267 | ||
1249 | u32 netxen_nic_hw_read_wx_128M(struct netxen_adapter *adapter, ulong off); | ||
1250 | int netxen_nic_hw_write_wx_128M(struct netxen_adapter *adapter, | ||
1251 | ulong off, u32 data); | ||
1252 | int netxen_nic_pci_mem_read_128M(struct netxen_adapter *adapter, | ||
1253 | u64 off, void *data, int size); | ||
1254 | int netxen_nic_pci_mem_write_128M(struct netxen_adapter *adapter, | ||
1255 | u64 off, void *data, int size); | ||
1256 | int netxen_nic_pci_write_immediate_128M(struct netxen_adapter *adapter, | ||
1257 | u64 off, u32 data); | ||
1258 | u32 netxen_nic_pci_read_immediate_128M(struct netxen_adapter *adapter, u64 off); | ||
1259 | void netxen_nic_pci_write_normalize_128M(struct netxen_adapter *adapter, | ||
1260 | u64 off, u32 data); | ||
1261 | u32 netxen_nic_pci_read_normalize_128M(struct netxen_adapter *adapter, u64 off); | ||
1262 | unsigned long netxen_nic_pci_set_window_128M(struct netxen_adapter *adapter, | ||
1263 | unsigned long long addr); | ||
1264 | void netxen_nic_pci_change_crbwindow_128M(struct netxen_adapter *adapter, | ||
1265 | u32 wndw); | ||
1266 | |||
1267 | u32 netxen_nic_hw_read_wx_2M(struct netxen_adapter *adapter, ulong off); | ||
1268 | int netxen_nic_hw_write_wx_2M(struct netxen_adapter *adapter, | ||
1269 | ulong off, u32 data); | ||
1270 | int netxen_nic_pci_mem_read_2M(struct netxen_adapter *adapter, | ||
1271 | u64 off, void *data, int size); | ||
1272 | int netxen_nic_pci_mem_write_2M(struct netxen_adapter *adapter, | ||
1273 | u64 off, void *data, int size); | ||
1274 | int netxen_nic_pci_write_immediate_2M(struct netxen_adapter *adapter, | ||
1275 | u64 off, u32 data); | ||
1276 | u32 netxen_nic_pci_read_immediate_2M(struct netxen_adapter *adapter, u64 off); | ||
1277 | void netxen_nic_pci_write_normalize_2M(struct netxen_adapter *adapter, | ||
1278 | u64 off, u32 data); | ||
1279 | u32 netxen_nic_pci_read_normalize_2M(struct netxen_adapter *adapter, u64 off); | ||
1280 | unsigned long netxen_nic_pci_set_window_2M(struct netxen_adapter *adapter, | ||
1281 | unsigned long long addr); | ||
1282 | |||
1283 | /* Functions from netxen_nic_init.c */ | 1268 | /* Functions from netxen_nic_init.c */ |
1284 | int netxen_init_dummy_dma(struct netxen_adapter *adapter); | 1269 | int netxen_init_dummy_dma(struct netxen_adapter *adapter); |
1285 | void netxen_free_dummy_dma(struct netxen_adapter *adapter); | 1270 | void netxen_free_dummy_dma(struct netxen_adapter *adapter); |
@@ -1307,13 +1292,15 @@ int netxen_rom_se(struct netxen_adapter *adapter, int addr); | |||
1307 | int netxen_alloc_sw_resources(struct netxen_adapter *adapter); | 1292 | int netxen_alloc_sw_resources(struct netxen_adapter *adapter); |
1308 | void netxen_free_sw_resources(struct netxen_adapter *adapter); | 1293 | void netxen_free_sw_resources(struct netxen_adapter *adapter); |
1309 | 1294 | ||
1295 | void netxen_setup_hwops(struct netxen_adapter *adapter); | ||
1296 | void __iomem *netxen_get_ioaddr(struct netxen_adapter *, u32); | ||
1297 | |||
1310 | int netxen_alloc_hw_resources(struct netxen_adapter *adapter); | 1298 | int netxen_alloc_hw_resources(struct netxen_adapter *adapter); |
1311 | void netxen_free_hw_resources(struct netxen_adapter *adapter); | 1299 | void netxen_free_hw_resources(struct netxen_adapter *adapter); |
1312 | 1300 | ||
1313 | void netxen_release_rx_buffers(struct netxen_adapter *adapter); | 1301 | void netxen_release_rx_buffers(struct netxen_adapter *adapter); |
1314 | void netxen_release_tx_buffers(struct netxen_adapter *adapter); | 1302 | void netxen_release_tx_buffers(struct netxen_adapter *adapter); |
1315 | 1303 | ||
1316 | void netxen_initialize_adapter_ops(struct netxen_adapter *adapter); | ||
1317 | int netxen_init_firmware(struct netxen_adapter *adapter); | 1304 | int netxen_init_firmware(struct netxen_adapter *adapter); |
1318 | void netxen_nic_clear_stats(struct netxen_adapter *adapter); | 1305 | void netxen_nic_clear_stats(struct netxen_adapter *adapter); |
1319 | void netxen_watchdog_task(struct work_struct *work); | 1306 | void netxen_watchdog_task(struct work_struct *work); |
diff --git a/drivers/net/netxen/netxen_nic_ctx.c b/drivers/net/netxen/netxen_nic_ctx.c index 0f42ab998368..33f82db01293 100644 --- a/drivers/net/netxen/netxen_nic_ctx.c +++ b/drivers/net/netxen/netxen_nic_ctx.c | |||
@@ -229,7 +229,8 @@ nx_fw_cmd_create_rx_ctx(struct netxen_adapter *adapter) | |||
229 | rds_ring = &recv_ctx->rds_rings[i]; | 229 | rds_ring = &recv_ctx->rds_rings[i]; |
230 | 230 | ||
231 | reg = le32_to_cpu(prsp_rds[i].host_producer_crb); | 231 | reg = le32_to_cpu(prsp_rds[i].host_producer_crb); |
232 | rds_ring->crb_rcv_producer = NETXEN_NIC_REG(reg - 0x200); | 232 | rds_ring->crb_rcv_producer = netxen_get_ioaddr(adapter, |
233 | NETXEN_NIC_REG(reg - 0x200)); | ||
233 | } | 234 | } |
234 | 235 | ||
235 | prsp_sds = ((nx_cardrsp_sds_ring_t *) | 236 | prsp_sds = ((nx_cardrsp_sds_ring_t *) |
@@ -239,10 +240,12 @@ nx_fw_cmd_create_rx_ctx(struct netxen_adapter *adapter) | |||
239 | sds_ring = &recv_ctx->sds_rings[i]; | 240 | sds_ring = &recv_ctx->sds_rings[i]; |
240 | 241 | ||
241 | reg = le32_to_cpu(prsp_sds[i].host_consumer_crb); | 242 | reg = le32_to_cpu(prsp_sds[i].host_consumer_crb); |
242 | sds_ring->crb_sts_consumer = NETXEN_NIC_REG(reg - 0x200); | 243 | sds_ring->crb_sts_consumer = netxen_get_ioaddr(adapter, |
244 | NETXEN_NIC_REG(reg - 0x200)); | ||
243 | 245 | ||
244 | reg = le32_to_cpu(prsp_sds[i].interrupt_crb); | 246 | reg = le32_to_cpu(prsp_sds[i].interrupt_crb); |
245 | sds_ring->crb_intr_mask = NETXEN_NIC_REG(reg - 0x200); | 247 | sds_ring->crb_intr_mask = netxen_get_ioaddr(adapter, |
248 | NETXEN_NIC_REG(reg - 0x200)); | ||
246 | } | 249 | } |
247 | 250 | ||
248 | recv_ctx->state = le32_to_cpu(prsp->host_ctx_state); | 251 | recv_ctx->state = le32_to_cpu(prsp->host_ctx_state); |
@@ -342,7 +345,8 @@ nx_fw_cmd_create_tx_ctx(struct netxen_adapter *adapter) | |||
342 | 345 | ||
343 | if (err == NX_RCODE_SUCCESS) { | 346 | if (err == NX_RCODE_SUCCESS) { |
344 | temp = le32_to_cpu(prsp->cds_ring.host_producer_crb); | 347 | temp = le32_to_cpu(prsp->cds_ring.host_producer_crb); |
345 | tx_ring->crb_cmd_producer = NETXEN_NIC_REG(temp - 0x200); | 348 | tx_ring->crb_cmd_producer = netxen_get_ioaddr(adapter, |
349 | NETXEN_NIC_REG(temp - 0x200)); | ||
346 | #if 0 | 350 | #if 0 |
347 | adapter->tx_state = | 351 | adapter->tx_state = |
348 | le32_to_cpu(prsp->host_ctx_state); | 352 | le32_to_cpu(prsp->host_ctx_state); |
@@ -651,7 +655,8 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter) | |||
651 | 655 | ||
652 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) | 656 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) |
653 | rds_ring->crb_rcv_producer = | 657 | rds_ring->crb_rcv_producer = |
654 | recv_crb_registers[port].crb_rcv_producer[ring]; | 658 | netxen_get_ioaddr(adapter, |
659 | recv_crb_registers[port].crb_rcv_producer[ring]); | ||
655 | } | 660 | } |
656 | 661 | ||
657 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 662 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { |
@@ -670,14 +675,19 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter) | |||
670 | sds_ring->desc_head = (struct status_desc *)addr; | 675 | sds_ring->desc_head = (struct status_desc *)addr; |
671 | 676 | ||
672 | sds_ring->crb_sts_consumer = | 677 | sds_ring->crb_sts_consumer = |
673 | recv_crb_registers[port].crb_sts_consumer[ring]; | 678 | netxen_get_ioaddr(adapter, |
679 | recv_crb_registers[port].crb_sts_consumer[ring]); | ||
674 | 680 | ||
675 | sds_ring->crb_intr_mask = | 681 | sds_ring->crb_intr_mask = |
676 | recv_crb_registers[port].sw_int_mask[ring]; | 682 | netxen_get_ioaddr(adapter, |
683 | recv_crb_registers[port].sw_int_mask[ring]); | ||
677 | } | 684 | } |
678 | 685 | ||
679 | 686 | ||
680 | if (!NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | 687 | if (!NX_IS_REVISION_P2(adapter->ahw.revision_id)) { |
688 | if (test_and_set_bit(__NX_FW_ATTACHED, &adapter->state)) | ||
689 | goto done; | ||
690 | |||
681 | err = nx_fw_cmd_create_rx_ctx(adapter); | 691 | err = nx_fw_cmd_create_rx_ctx(adapter); |
682 | if (err) | 692 | if (err) |
683 | goto err_out_free; | 693 | goto err_out_free; |
@@ -690,6 +700,7 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter) | |||
690 | goto err_out_free; | 700 | goto err_out_free; |
691 | } | 701 | } |
692 | 702 | ||
703 | done: | ||
693 | return 0; | 704 | return 0; |
694 | 705 | ||
695 | err_out_free: | 706 | err_out_free: |
@@ -708,6 +719,9 @@ void netxen_free_hw_resources(struct netxen_adapter *adapter) | |||
708 | int port = adapter->portnum; | 719 | int port = adapter->portnum; |
709 | 720 | ||
710 | if (!NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | 721 | if (!NX_IS_REVISION_P2(adapter->ahw.revision_id)) { |
722 | if (!test_and_clear_bit(__NX_FW_ATTACHED, &adapter->state)) | ||
723 | goto done; | ||
724 | |||
711 | nx_fw_cmd_destroy_rx_ctx(adapter); | 725 | nx_fw_cmd_destroy_rx_ctx(adapter); |
712 | nx_fw_cmd_destroy_tx_ctx(adapter); | 726 | nx_fw_cmd_destroy_tx_ctx(adapter); |
713 | } else { | 727 | } else { |
@@ -720,6 +734,7 @@ void netxen_free_hw_resources(struct netxen_adapter *adapter) | |||
720 | /* Allow dma queues to drain after context reset */ | 734 | /* Allow dma queues to drain after context reset */ |
721 | msleep(20); | 735 | msleep(20); |
722 | 736 | ||
737 | done: | ||
723 | recv_ctx = &adapter->recv_ctx; | 738 | recv_ctx = &adapter->recv_ctx; |
724 | 739 | ||
725 | if (recv_ctx->hwctx != NULL) { | 740 | if (recv_ctx->hwctx != NULL) { |
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c index e376a1c4eb06..d18832ce4b58 100644 --- a/drivers/net/netxen/netxen_nic_ethtool.c +++ b/drivers/net/netxen/netxen_nic_ethtool.c | |||
@@ -84,18 +84,17 @@ static void | |||
84 | netxen_nic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo) | 84 | netxen_nic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo) |
85 | { | 85 | { |
86 | struct netxen_adapter *adapter = netdev_priv(dev); | 86 | struct netxen_adapter *adapter = netdev_priv(dev); |
87 | unsigned long flags; | ||
88 | u32 fw_major = 0; | 87 | u32 fw_major = 0; |
89 | u32 fw_minor = 0; | 88 | u32 fw_minor = 0; |
90 | u32 fw_build = 0; | 89 | u32 fw_build = 0; |
91 | 90 | ||
92 | strncpy(drvinfo->driver, netxen_nic_driver_name, 32); | 91 | strncpy(drvinfo->driver, netxen_nic_driver_name, 32); |
93 | strncpy(drvinfo->version, NETXEN_NIC_LINUX_VERSIONID, 32); | 92 | strncpy(drvinfo->version, NETXEN_NIC_LINUX_VERSIONID, 32); |
94 | write_lock_irqsave(&adapter->adapter_lock, flags); | 93 | read_lock(&adapter->adapter_lock); |
95 | fw_major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR); | 94 | fw_major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR); |
96 | fw_minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR); | 95 | fw_minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR); |
97 | fw_build = NXRD32(adapter, NETXEN_FW_VERSION_SUB); | 96 | fw_build = NXRD32(adapter, NETXEN_FW_VERSION_SUB); |
98 | write_unlock_irqrestore(&adapter->adapter_lock, flags); | 97 | read_unlock(&adapter->adapter_lock); |
99 | sprintf(drvinfo->fw_version, "%d.%d.%d", fw_major, fw_minor, fw_build); | 98 | sprintf(drvinfo->fw_version, "%d.%d.%d", fw_major, fw_minor, fw_build); |
100 | 99 | ||
101 | strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); | 100 | strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); |
diff --git a/drivers/net/netxen/netxen_nic_hdr.h b/drivers/net/netxen/netxen_nic_hdr.h index 92f5970c9aa9..26188b43abe9 100644 --- a/drivers/net/netxen/netxen_nic_hdr.h +++ b/drivers/net/netxen/netxen_nic_hdr.h | |||
@@ -433,6 +433,7 @@ enum { | |||
433 | #define NETXEN_CRB_PEG_NET_1 NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGN1) | 433 | #define NETXEN_CRB_PEG_NET_1 NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGN1) |
434 | #define NETXEN_CRB_PEG_NET_2 NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGN2) | 434 | #define NETXEN_CRB_PEG_NET_2 NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGN2) |
435 | #define NETXEN_CRB_PEG_NET_3 NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGN3) | 435 | #define NETXEN_CRB_PEG_NET_3 NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGN3) |
436 | #define NETXEN_CRB_PEG_NET_4 NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_SQS2) | ||
436 | #define NETXEN_CRB_PEG_NET_D NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGND) | 437 | #define NETXEN_CRB_PEG_NET_D NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGND) |
437 | #define NETXEN_CRB_PEG_NET_I NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGNI) | 438 | #define NETXEN_CRB_PEG_NET_I NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_PGNI) |
438 | #define NETXEN_CRB_DDR_NET NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_MN) | 439 | #define NETXEN_CRB_DDR_NET NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_MN) |
@@ -945,6 +946,28 @@ enum { | |||
945 | 946 | ||
946 | #define NETXEN_DMA_WATCHDOG_CTRL (NETXEN_CAM_RAM(0x14)) | 947 | #define NETXEN_DMA_WATCHDOG_CTRL (NETXEN_CAM_RAM(0x14)) |
947 | #define NETXEN_PEG_ALIVE_COUNTER (NETXEN_CAM_RAM(0xb0)) | 948 | #define NETXEN_PEG_ALIVE_COUNTER (NETXEN_CAM_RAM(0xb0)) |
949 | #define NETXEN_PEG_HALT_STATUS1 (NETXEN_CAM_RAM(0xa8)) | ||
950 | #define NETXEN_PEG_HALT_STATUS2 (NETXEN_CAM_RAM(0xac)) | ||
951 | #define NX_CRB_DEV_REF_COUNT (NETXEN_CAM_RAM(0x138)) | ||
952 | #define NX_CRB_DEV_STATE (NETXEN_CAM_RAM(0x140)) | ||
953 | |||
954 | /* Device State */ | ||
955 | #define NX_DEV_COLD 1 | ||
956 | #define NX_DEV_INITALIZING 2 | ||
957 | #define NX_DEV_READY 3 | ||
958 | #define NX_DEV_NEED_RESET 4 | ||
959 | #define NX_DEV_NEED_QUISCENT 5 | ||
960 | #define NX_DEV_FAILED 6 | ||
961 | |||
962 | #define NX_RCODE_DRIVER_INFO 0x20000000 | ||
963 | #define NX_RCODE_DRIVER_CAN_RELOAD 0x40000000 | ||
964 | #define NX_RCODE_FATAL_ERROR 0x80000000 | ||
965 | #define NX_FWERROR_PEGNUM(code) ((code) & 0xff) | ||
966 | #define NX_FWERROR_CODE(code) ((code >> 8) & 0xfffff) | ||
967 | |||
968 | #define FW_POLL_DELAY (2 * HZ) | ||
969 | #define FW_FAIL_THRESH 3 | ||
970 | #define FW_POLL_THRESH 10 | ||
948 | 971 | ||
949 | #define ISR_MSI_INT_TRIGGER(FUNC) (NETXEN_PCIX_PS_REG(PCIX_MSI_F(FUNC))) | 972 | #define ISR_MSI_INT_TRIGGER(FUNC) (NETXEN_PCIX_PS_REG(PCIX_MSI_F(FUNC))) |
950 | #define ISR_LEGACY_INT_TRIGGERED(VAL) (((VAL) & 0x300) == 0x200) | 973 | #define ISR_LEGACY_INT_TRIGGERED(VAL) (((VAL) & 0x300) == 0x200) |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index db510cee8094..555bc4a7e888 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
@@ -566,6 +566,9 @@ netxen_send_cmd_descs(struct netxen_adapter *adapter, | |||
566 | 566 | ||
567 | i = 0; | 567 | i = 0; |
568 | 568 | ||
569 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) | ||
570 | return -EIO; | ||
571 | |||
569 | tx_ring = adapter->tx_ring; | 572 | tx_ring = adapter->tx_ring; |
570 | __netif_tx_lock_bh(tx_ring->txq); | 573 | __netif_tx_lock_bh(tx_ring->txq); |
571 | 574 | ||
@@ -1047,7 +1050,7 @@ int netxen_p3_get_mac_addr(struct netxen_adapter *adapter, __le64 *mac) | |||
1047 | /* | 1050 | /* |
1048 | * Changes the CRB window to the specified window. | 1051 | * Changes the CRB window to the specified window. |
1049 | */ | 1052 | */ |
1050 | void | 1053 | static void |
1051 | netxen_nic_pci_change_crbwindow_128M(struct netxen_adapter *adapter, u32 wndw) | 1054 | netxen_nic_pci_change_crbwindow_128M(struct netxen_adapter *adapter, u32 wndw) |
1052 | { | 1055 | { |
1053 | void __iomem *offset; | 1056 | void __iomem *offset; |
@@ -1160,61 +1163,68 @@ netxen_nic_pci_set_crbwindow_2M(struct netxen_adapter *adapter, ulong *off) | |||
1160 | (ulong)adapter->ahw.pci_base0; | 1163 | (ulong)adapter->ahw.pci_base0; |
1161 | } | 1164 | } |
1162 | 1165 | ||
1163 | int | 1166 | static int |
1164 | netxen_nic_hw_write_wx_128M(struct netxen_adapter *adapter, ulong off, u32 data) | 1167 | netxen_nic_hw_write_wx_128M(struct netxen_adapter *adapter, ulong off, u32 data) |
1165 | { | 1168 | { |
1169 | unsigned long flags; | ||
1166 | void __iomem *addr; | 1170 | void __iomem *addr; |
1167 | 1171 | ||
1168 | if (ADDR_IN_WINDOW1(off)) { | 1172 | if (ADDR_IN_WINDOW1(off)) |
1169 | addr = NETXEN_CRB_NORMALIZE(adapter, off); | 1173 | addr = NETXEN_CRB_NORMALIZE(adapter, off); |
1174 | else | ||
1175 | addr = pci_base_offset(adapter, off); | ||
1176 | |||
1177 | BUG_ON(!addr); | ||
1178 | |||
1179 | if (ADDR_IN_WINDOW1(off)) { /* Window 1 */ | ||
1180 | read_lock(&adapter->adapter_lock); | ||
1181 | writel(data, addr); | ||
1182 | read_unlock(&adapter->adapter_lock); | ||
1170 | } else { /* Window 0 */ | 1183 | } else { /* Window 0 */ |
1184 | write_lock_irqsave(&adapter->adapter_lock, flags); | ||
1171 | addr = pci_base_offset(adapter, off); | 1185 | addr = pci_base_offset(adapter, off); |
1172 | netxen_nic_pci_change_crbwindow_128M(adapter, 0); | 1186 | netxen_nic_pci_change_crbwindow_128M(adapter, 0); |
1173 | } | 1187 | writel(data, addr); |
1174 | |||
1175 | if (!addr) { | ||
1176 | netxen_nic_pci_change_crbwindow_128M(adapter, 1); | 1188 | netxen_nic_pci_change_crbwindow_128M(adapter, 1); |
1177 | return 1; | 1189 | write_unlock_irqrestore(&adapter->adapter_lock, flags); |
1178 | } | 1190 | } |
1179 | 1191 | ||
1180 | writel(data, addr); | ||
1181 | |||
1182 | if (!ADDR_IN_WINDOW1(off)) | ||
1183 | netxen_nic_pci_change_crbwindow_128M(adapter, 1); | ||
1184 | |||
1185 | return 0; | 1192 | return 0; |
1186 | } | 1193 | } |
1187 | 1194 | ||
1188 | u32 | 1195 | static u32 |
1189 | netxen_nic_hw_read_wx_128M(struct netxen_adapter *adapter, ulong off) | 1196 | netxen_nic_hw_read_wx_128M(struct netxen_adapter *adapter, ulong off) |
1190 | { | 1197 | { |
1198 | unsigned long flags; | ||
1191 | void __iomem *addr; | 1199 | void __iomem *addr; |
1192 | u32 data; | 1200 | u32 data; |
1193 | 1201 | ||
1194 | if (ADDR_IN_WINDOW1(off)) { /* Window 1 */ | 1202 | if (ADDR_IN_WINDOW1(off)) |
1195 | addr = NETXEN_CRB_NORMALIZE(adapter, off); | 1203 | addr = NETXEN_CRB_NORMALIZE(adapter, off); |
1196 | } else { /* Window 0 */ | 1204 | else |
1197 | addr = pci_base_offset(adapter, off); | 1205 | addr = pci_base_offset(adapter, off); |
1198 | netxen_nic_pci_change_crbwindow_128M(adapter, 0); | ||
1199 | } | ||
1200 | 1206 | ||
1201 | if (!addr) { | 1207 | BUG_ON(!addr); |
1202 | netxen_nic_pci_change_crbwindow_128M(adapter, 1); | ||
1203 | return 1; | ||
1204 | } | ||
1205 | |||
1206 | data = readl(addr); | ||
1207 | 1208 | ||
1208 | if (!ADDR_IN_WINDOW1(off)) | 1209 | if (ADDR_IN_WINDOW1(off)) { /* Window 1 */ |
1210 | read_lock(&adapter->adapter_lock); | ||
1211 | data = readl(addr); | ||
1212 | read_unlock(&adapter->adapter_lock); | ||
1213 | } else { /* Window 0 */ | ||
1214 | write_lock_irqsave(&adapter->adapter_lock, flags); | ||
1215 | netxen_nic_pci_change_crbwindow_128M(adapter, 0); | ||
1216 | data = readl(addr); | ||
1209 | netxen_nic_pci_change_crbwindow_128M(adapter, 1); | 1217 | netxen_nic_pci_change_crbwindow_128M(adapter, 1); |
1218 | write_unlock_irqrestore(&adapter->adapter_lock, flags); | ||
1219 | } | ||
1210 | 1220 | ||
1211 | return data; | 1221 | return data; |
1212 | } | 1222 | } |
1213 | 1223 | ||
1214 | int | 1224 | static int |
1215 | netxen_nic_hw_write_wx_2M(struct netxen_adapter *adapter, ulong off, u32 data) | 1225 | netxen_nic_hw_write_wx_2M(struct netxen_adapter *adapter, ulong off, u32 data) |
1216 | { | 1226 | { |
1217 | unsigned long flags = 0; | 1227 | unsigned long flags; |
1218 | int rv; | 1228 | int rv; |
1219 | 1229 | ||
1220 | rv = netxen_nic_pci_get_crb_addr_2M(adapter, &off); | 1230 | rv = netxen_nic_pci_get_crb_addr_2M(adapter, &off); |
@@ -1240,10 +1250,10 @@ netxen_nic_hw_write_wx_2M(struct netxen_adapter *adapter, ulong off, u32 data) | |||
1240 | return 0; | 1250 | return 0; |
1241 | } | 1251 | } |
1242 | 1252 | ||
1243 | u32 | 1253 | static u32 |
1244 | netxen_nic_hw_read_wx_2M(struct netxen_adapter *adapter, ulong off) | 1254 | netxen_nic_hw_read_wx_2M(struct netxen_adapter *adapter, ulong off) |
1245 | { | 1255 | { |
1246 | unsigned long flags = 0; | 1256 | unsigned long flags; |
1247 | int rv; | 1257 | int rv; |
1248 | u32 data; | 1258 | u32 data; |
1249 | 1259 | ||
@@ -1290,7 +1300,7 @@ netxen_nic_pci_mem_bound_check(struct netxen_adapter *adapter, | |||
1290 | 1300 | ||
1291 | static int netxen_pci_set_window_warning_count; | 1301 | static int netxen_pci_set_window_warning_count; |
1292 | 1302 | ||
1293 | unsigned long | 1303 | static unsigned long |
1294 | netxen_nic_pci_set_window_128M(struct netxen_adapter *adapter, | 1304 | netxen_nic_pci_set_window_128M(struct netxen_adapter *adapter, |
1295 | unsigned long long addr) | 1305 | unsigned long long addr) |
1296 | { | 1306 | { |
@@ -1354,22 +1364,56 @@ netxen_nic_pci_set_window_128M(struct netxen_adapter *adapter, | |||
1354 | return addr; | 1364 | return addr; |
1355 | } | 1365 | } |
1356 | 1366 | ||
1357 | /* | 1367 | /* window 1 registers only */ |
1358 | * Note : only 32-bit writes! | 1368 | static void netxen_nic_io_write_128M(struct netxen_adapter *adapter, |
1359 | */ | 1369 | void __iomem *addr, u32 data) |
1360 | int netxen_nic_pci_write_immediate_128M(struct netxen_adapter *adapter, | ||
1361 | u64 off, u32 data) | ||
1362 | { | 1370 | { |
1363 | writel(data, (void __iomem *)(PCI_OFFSET_SECOND_RANGE(adapter, off))); | 1371 | read_lock(&adapter->adapter_lock); |
1364 | return 0; | 1372 | writel(data, addr); |
1373 | read_unlock(&adapter->adapter_lock); | ||
1365 | } | 1374 | } |
1366 | 1375 | ||
1367 | u32 netxen_nic_pci_read_immediate_128M(struct netxen_adapter *adapter, u64 off) | 1376 | static u32 netxen_nic_io_read_128M(struct netxen_adapter *adapter, |
1377 | void __iomem *addr) | ||
1368 | { | 1378 | { |
1369 | return readl((void __iomem *)(pci_base_offset(adapter, off))); | 1379 | u32 val; |
1380 | |||
1381 | read_lock(&adapter->adapter_lock); | ||
1382 | val = readl(addr); | ||
1383 | read_unlock(&adapter->adapter_lock); | ||
1384 | |||
1385 | return val; | ||
1370 | } | 1386 | } |
1371 | 1387 | ||
1372 | unsigned long | 1388 | static void netxen_nic_io_write_2M(struct netxen_adapter *adapter, |
1389 | void __iomem *addr, u32 data) | ||
1390 | { | ||
1391 | writel(data, addr); | ||
1392 | } | ||
1393 | |||
1394 | static u32 netxen_nic_io_read_2M(struct netxen_adapter *adapter, | ||
1395 | void __iomem *addr) | ||
1396 | { | ||
1397 | return readl(addr); | ||
1398 | } | ||
1399 | |||
1400 | void __iomem * | ||
1401 | netxen_get_ioaddr(struct netxen_adapter *adapter, u32 offset) | ||
1402 | { | ||
1403 | ulong off = offset; | ||
1404 | |||
1405 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | ||
1406 | if (offset < NETXEN_CRB_PCIX_HOST2 && | ||
1407 | offset > NETXEN_CRB_PCIX_HOST) | ||
1408 | return PCI_OFFSET_SECOND_RANGE(adapter, offset); | ||
1409 | return NETXEN_CRB_NORMALIZE(adapter, offset); | ||
1410 | } | ||
1411 | |||
1412 | BUG_ON(netxen_nic_pci_get_crb_addr_2M(adapter, &off)); | ||
1413 | return (void __iomem *)off; | ||
1414 | } | ||
1415 | |||
1416 | static unsigned long | ||
1373 | netxen_nic_pci_set_window_2M(struct netxen_adapter *adapter, | 1417 | netxen_nic_pci_set_window_2M(struct netxen_adapter *adapter, |
1374 | unsigned long long addr) | 1418 | unsigned long long addr) |
1375 | { | 1419 | { |
@@ -1613,7 +1657,7 @@ netxen_nic_pci_mem_write_direct(struct netxen_adapter *adapter, u64 off, | |||
1613 | 1657 | ||
1614 | #define MAX_CTL_CHECK 1000 | 1658 | #define MAX_CTL_CHECK 1000 |
1615 | 1659 | ||
1616 | int | 1660 | static int |
1617 | netxen_nic_pci_mem_write_128M(struct netxen_adapter *adapter, | 1661 | netxen_nic_pci_mem_write_128M(struct netxen_adapter *adapter, |
1618 | u64 off, void *data, int size) | 1662 | u64 off, void *data, int size) |
1619 | { | 1663 | { |
@@ -1706,7 +1750,7 @@ netxen_nic_pci_mem_write_128M(struct netxen_adapter *adapter, | |||
1706 | return ret; | 1750 | return ret; |
1707 | } | 1751 | } |
1708 | 1752 | ||
1709 | int | 1753 | static int |
1710 | netxen_nic_pci_mem_read_128M(struct netxen_adapter *adapter, | 1754 | netxen_nic_pci_mem_read_128M(struct netxen_adapter *adapter, |
1711 | u64 off, void *data, int size) | 1755 | u64 off, void *data, int size) |
1712 | { | 1756 | { |
@@ -1797,7 +1841,7 @@ netxen_nic_pci_mem_read_128M(struct netxen_adapter *adapter, | |||
1797 | return 0; | 1841 | return 0; |
1798 | } | 1842 | } |
1799 | 1843 | ||
1800 | int | 1844 | static int |
1801 | netxen_nic_pci_mem_write_2M(struct netxen_adapter *adapter, | 1845 | netxen_nic_pci_mem_write_2M(struct netxen_adapter *adapter, |
1802 | u64 off, void *data, int size) | 1846 | u64 off, void *data, int size) |
1803 | { | 1847 | { |
@@ -1825,8 +1869,8 @@ netxen_nic_pci_mem_write_2M(struct netxen_adapter *adapter, | |||
1825 | 1869 | ||
1826 | if ((size != 8) || (off0 != 0)) { | 1870 | if ((size != 8) || (off0 != 0)) { |
1827 | for (i = 0; i < loop; i++) { | 1871 | for (i = 0; i < loop; i++) { |
1828 | if (adapter->pci_mem_read(adapter, off8 + (i << 3), | 1872 | if (adapter->pci_mem_read(adapter, |
1829 | &word[i], 8)) | 1873 | off8 + (i << 3), &word[i], 8)) |
1830 | return -1; | 1874 | return -1; |
1831 | } | 1875 | } |
1832 | } | 1876 | } |
@@ -1897,7 +1941,7 @@ netxen_nic_pci_mem_write_2M(struct netxen_adapter *adapter, | |||
1897 | return ret; | 1941 | return ret; |
1898 | } | 1942 | } |
1899 | 1943 | ||
1900 | int | 1944 | static int |
1901 | netxen_nic_pci_mem_read_2M(struct netxen_adapter *adapter, | 1945 | netxen_nic_pci_mem_read_2M(struct netxen_adapter *adapter, |
1902 | u64 off, void *data, int size) | 1946 | u64 off, void *data, int size) |
1903 | { | 1947 | { |
@@ -1995,20 +2039,43 @@ netxen_nic_pci_mem_read_2M(struct netxen_adapter *adapter, | |||
1995 | return 0; | 2039 | return 0; |
1996 | } | 2040 | } |
1997 | 2041 | ||
1998 | /* | 2042 | void |
1999 | * Note : only 32-bit writes! | 2043 | netxen_setup_hwops(struct netxen_adapter *adapter) |
2000 | */ | ||
2001 | int netxen_nic_pci_write_immediate_2M(struct netxen_adapter *adapter, | ||
2002 | u64 off, u32 data) | ||
2003 | { | 2044 | { |
2004 | NXWR32(adapter, off, data); | 2045 | adapter->init_port = netxen_niu_xg_init_port; |
2046 | adapter->stop_port = netxen_niu_disable_xg_port; | ||
2005 | 2047 | ||
2006 | return 0; | 2048 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { |
2007 | } | 2049 | adapter->crb_read = netxen_nic_hw_read_wx_128M, |
2050 | adapter->crb_write = netxen_nic_hw_write_wx_128M, | ||
2051 | adapter->pci_set_window = netxen_nic_pci_set_window_128M, | ||
2052 | adapter->pci_mem_read = netxen_nic_pci_mem_read_128M, | ||
2053 | adapter->pci_mem_write = netxen_nic_pci_mem_write_128M, | ||
2054 | adapter->io_read = netxen_nic_io_read_128M, | ||
2055 | adapter->io_write = netxen_nic_io_write_128M, | ||
2056 | |||
2057 | adapter->macaddr_set = netxen_p2_nic_set_mac_addr; | ||
2058 | adapter->set_multi = netxen_p2_nic_set_multi; | ||
2059 | adapter->set_mtu = netxen_nic_set_mtu_xgb; | ||
2060 | adapter->set_promisc = netxen_p2_nic_set_promisc; | ||
2008 | 2061 | ||
2009 | u32 netxen_nic_pci_read_immediate_2M(struct netxen_adapter *adapter, u64 off) | 2062 | } else { |
2010 | { | 2063 | adapter->crb_read = netxen_nic_hw_read_wx_2M, |
2011 | return NXRD32(adapter, off); | 2064 | adapter->crb_write = netxen_nic_hw_write_wx_2M, |
2065 | adapter->pci_set_window = netxen_nic_pci_set_window_2M, | ||
2066 | adapter->pci_mem_read = netxen_nic_pci_mem_read_2M, | ||
2067 | adapter->pci_mem_write = netxen_nic_pci_mem_write_2M, | ||
2068 | adapter->io_read = netxen_nic_io_read_2M, | ||
2069 | adapter->io_write = netxen_nic_io_write_2M, | ||
2070 | |||
2071 | adapter->set_mtu = nx_fw_cmd_set_mtu; | ||
2072 | adapter->set_promisc = netxen_p3_nic_set_promisc; | ||
2073 | adapter->macaddr_set = netxen_p3_nic_set_mac_addr; | ||
2074 | adapter->set_multi = netxen_p3_nic_set_multi; | ||
2075 | |||
2076 | adapter->phy_read = nx_fw_cmd_query_phy; | ||
2077 | adapter->phy_write = nx_fw_cmd_set_phy; | ||
2078 | } | ||
2012 | } | 2079 | } |
2013 | 2080 | ||
2014 | int netxen_nic_get_board_info(struct netxen_adapter *adapter) | 2081 | int netxen_nic_get_board_info(struct netxen_adapter *adapter) |
@@ -2173,65 +2240,6 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter) | |||
2173 | } | 2240 | } |
2174 | } | 2241 | } |
2175 | 2242 | ||
2176 | void netxen_nic_get_firmware_info(struct netxen_adapter *adapter) | ||
2177 | { | ||
2178 | u32 fw_major, fw_minor, fw_build; | ||
2179 | char brd_name[NETXEN_MAX_SHORT_NAME]; | ||
2180 | char serial_num[32]; | ||
2181 | int i, offset, val; | ||
2182 | int *ptr32; | ||
2183 | struct pci_dev *pdev = adapter->pdev; | ||
2184 | |||
2185 | adapter->driver_mismatch = 0; | ||
2186 | |||
2187 | ptr32 = (int *)&serial_num; | ||
2188 | offset = NX_FW_SERIAL_NUM_OFFSET; | ||
2189 | for (i = 0; i < 8; i++) { | ||
2190 | if (netxen_rom_fast_read(adapter, offset, &val) == -1) { | ||
2191 | dev_err(&pdev->dev, "error reading board info\n"); | ||
2192 | adapter->driver_mismatch = 1; | ||
2193 | return; | ||
2194 | } | ||
2195 | ptr32[i] = cpu_to_le32(val); | ||
2196 | offset += sizeof(u32); | ||
2197 | } | ||
2198 | |||
2199 | fw_major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR); | ||
2200 | fw_minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR); | ||
2201 | fw_build = NXRD32(adapter, NETXEN_FW_VERSION_SUB); | ||
2202 | |||
2203 | adapter->fw_version = NETXEN_VERSION_CODE(fw_major, fw_minor, fw_build); | ||
2204 | |||
2205 | if (adapter->portnum == 0) { | ||
2206 | get_brd_name_by_type(adapter->ahw.board_type, brd_name); | ||
2207 | |||
2208 | printk(KERN_INFO "NetXen %s Board S/N %s Chip rev 0x%x\n", | ||
2209 | brd_name, serial_num, adapter->ahw.revision_id); | ||
2210 | } | ||
2211 | |||
2212 | if (adapter->fw_version < NETXEN_VERSION_CODE(3, 4, 216)) { | ||
2213 | adapter->driver_mismatch = 1; | ||
2214 | dev_warn(&pdev->dev, "firmware version %d.%d.%d unsupported\n", | ||
2215 | fw_major, fw_minor, fw_build); | ||
2216 | return; | ||
2217 | } | ||
2218 | |||
2219 | dev_info(&pdev->dev, "firmware version %d.%d.%d\n", | ||
2220 | fw_major, fw_minor, fw_build); | ||
2221 | |||
2222 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | ||
2223 | i = NXRD32(adapter, NETXEN_SRE_MISC); | ||
2224 | adapter->ahw.cut_through = (i & 0x8000) ? 1 : 0; | ||
2225 | dev_info(&pdev->dev, "firmware running in %s mode\n", | ||
2226 | adapter->ahw.cut_through ? "cut-through" : "legacy"); | ||
2227 | } | ||
2228 | |||
2229 | if (adapter->fw_version >= NETXEN_VERSION_CODE(4, 0, 222)) | ||
2230 | adapter->capabilities = NXRD32(adapter, CRB_FW_CAPABILITIES_1); | ||
2231 | |||
2232 | adapter->flags &= ~NETXEN_NIC_LRO_ENABLED; | ||
2233 | } | ||
2234 | |||
2235 | int | 2243 | int |
2236 | netxen_nic_wol_supported(struct netxen_adapter *adapter) | 2244 | netxen_nic_wol_supported(struct netxen_adapter *adapter) |
2237 | { | 2245 | { |
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 04e36f2b1a93..485b947932a1 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
@@ -323,29 +323,6 @@ err_out: | |||
323 | return -ENOMEM; | 323 | return -ENOMEM; |
324 | } | 324 | } |
325 | 325 | ||
326 | void netxen_initialize_adapter_ops(struct netxen_adapter *adapter) | ||
327 | { | ||
328 | adapter->init_port = netxen_niu_xg_init_port; | ||
329 | adapter->stop_port = netxen_niu_disable_xg_port; | ||
330 | |||
331 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | ||
332 | adapter->macaddr_set = netxen_p2_nic_set_mac_addr; | ||
333 | adapter->set_multi = netxen_p2_nic_set_multi; | ||
334 | adapter->set_mtu = netxen_nic_set_mtu_xgb; | ||
335 | adapter->set_promisc = netxen_p2_nic_set_promisc; | ||
336 | } else { | ||
337 | adapter->set_mtu = nx_fw_cmd_set_mtu; | ||
338 | adapter->set_promisc = netxen_p3_nic_set_promisc; | ||
339 | adapter->macaddr_set = netxen_p3_nic_set_mac_addr; | ||
340 | adapter->set_multi = netxen_p3_nic_set_multi; | ||
341 | |||
342 | if (adapter->ahw.port_type == NETXEN_NIC_GBE) { | ||
343 | adapter->phy_read = nx_fw_cmd_query_phy; | ||
344 | adapter->phy_write = nx_fw_cmd_set_phy; | ||
345 | } | ||
346 | } | ||
347 | } | ||
348 | |||
349 | /* | 326 | /* |
350 | * netxen_decode_crb_addr(0 - utility to translate from internal Phantom CRB | 327 | * netxen_decode_crb_addr(0 - utility to translate from internal Phantom CRB |
351 | * address to external PCI CRB address. | 328 | * address to external PCI CRB address. |
@@ -905,6 +882,7 @@ netxen_release_firmware(struct netxen_adapter *adapter) | |||
905 | { | 882 | { |
906 | if (adapter->fw) | 883 | if (adapter->fw) |
907 | release_firmware(adapter->fw); | 884 | release_firmware(adapter->fw); |
885 | adapter->fw = NULL; | ||
908 | } | 886 | } |
909 | 887 | ||
910 | int netxen_init_dummy_dma(struct netxen_adapter *adapter) | 888 | int netxen_init_dummy_dma(struct netxen_adapter *adapter) |
@@ -1394,7 +1372,7 @@ skip: | |||
1394 | 1372 | ||
1395 | if (count) { | 1373 | if (count) { |
1396 | sds_ring->consumer = consumer; | 1374 | sds_ring->consumer = consumer; |
1397 | NXWR32(adapter, sds_ring->crb_sts_consumer, consumer); | 1375 | NXWRIO(adapter, sds_ring->crb_sts_consumer, consumer); |
1398 | } | 1376 | } |
1399 | 1377 | ||
1400 | return count; | 1378 | return count; |
@@ -1512,7 +1490,7 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid, | |||
1512 | 1490 | ||
1513 | if (count) { | 1491 | if (count) { |
1514 | rds_ring->producer = producer; | 1492 | rds_ring->producer = producer; |
1515 | NXWR32(adapter, rds_ring->crb_rcv_producer, | 1493 | NXWRIO(adapter, rds_ring->crb_rcv_producer, |
1516 | (producer-1) & (rds_ring->num_desc-1)); | 1494 | (producer-1) & (rds_ring->num_desc-1)); |
1517 | 1495 | ||
1518 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | 1496 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { |
@@ -1528,9 +1506,10 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid, | |||
1528 | (rds_ring->num_desc - 1))); | 1506 | (rds_ring->num_desc - 1))); |
1529 | netxen_set_msg_ctxid(msg, adapter->portnum); | 1507 | netxen_set_msg_ctxid(msg, adapter->portnum); |
1530 | netxen_set_msg_opcode(msg, NETXEN_RCV_PRODUCER(ringid)); | 1508 | netxen_set_msg_opcode(msg, NETXEN_RCV_PRODUCER(ringid)); |
1531 | writel(msg, | 1509 | read_lock(&adapter->adapter_lock); |
1532 | DB_NORMALIZE(adapter, | 1510 | writel(msg, DB_NORMALIZE(adapter, |
1533 | NETXEN_RCV_PRODUCER_OFFSET)); | 1511 | NETXEN_RCV_PRODUCER_OFFSET)); |
1512 | read_unlock(&adapter->adapter_lock); | ||
1534 | } | 1513 | } |
1535 | } | 1514 | } |
1536 | } | 1515 | } |
@@ -1572,7 +1551,7 @@ netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, | |||
1572 | 1551 | ||
1573 | if (count) { | 1552 | if (count) { |
1574 | rds_ring->producer = producer; | 1553 | rds_ring->producer = producer; |
1575 | NXWR32(adapter, rds_ring->crb_rcv_producer, | 1554 | NXWRIO(adapter, rds_ring->crb_rcv_producer, |
1576 | (producer - 1) & (rds_ring->num_desc - 1)); | 1555 | (producer - 1) & (rds_ring->num_desc - 1)); |
1577 | } | 1556 | } |
1578 | spin_unlock(&rds_ring->lock); | 1557 | spin_unlock(&rds_ring->lock); |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 41b29671fc9a..304618aa09dd 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -67,7 +67,10 @@ static netdev_tx_t netxen_nic_xmit_frame(struct sk_buff *, | |||
67 | struct net_device *); | 67 | struct net_device *); |
68 | static void netxen_tx_timeout(struct net_device *netdev); | 68 | static void netxen_tx_timeout(struct net_device *netdev); |
69 | static void netxen_reset_task(struct work_struct *work); | 69 | static void netxen_reset_task(struct work_struct *work); |
70 | static void netxen_watchdog(unsigned long); | 70 | static void netxen_fw_poll_work(struct work_struct *work); |
71 | static void netxen_schedule_work(struct netxen_adapter *adapter, | ||
72 | work_func_t func, int delay); | ||
73 | static void netxen_cancel_fw_work(struct netxen_adapter *adapter); | ||
71 | static int netxen_nic_poll(struct napi_struct *napi, int budget); | 74 | static int netxen_nic_poll(struct napi_struct *napi, int budget); |
72 | #ifdef CONFIG_NET_POLL_CONTROLLER | 75 | #ifdef CONFIG_NET_POLL_CONTROLLER |
73 | static void netxen_nic_poll_controller(struct net_device *netdev); | 76 | static void netxen_nic_poll_controller(struct net_device *netdev); |
@@ -76,10 +79,15 @@ static void netxen_nic_poll_controller(struct net_device *netdev); | |||
76 | static void netxen_create_sysfs_entries(struct netxen_adapter *adapter); | 79 | static void netxen_create_sysfs_entries(struct netxen_adapter *adapter); |
77 | static void netxen_remove_sysfs_entries(struct netxen_adapter *adapter); | 80 | static void netxen_remove_sysfs_entries(struct netxen_adapter *adapter); |
78 | 81 | ||
82 | static int nx_decr_dev_ref_cnt(struct netxen_adapter *adapter); | ||
83 | static int netxen_can_start_firmware(struct netxen_adapter *adapter); | ||
84 | |||
79 | static irqreturn_t netxen_intr(int irq, void *data); | 85 | static irqreturn_t netxen_intr(int irq, void *data); |
80 | static irqreturn_t netxen_msi_intr(int irq, void *data); | 86 | static irqreturn_t netxen_msi_intr(int irq, void *data); |
81 | static irqreturn_t netxen_msix_intr(int irq, void *data); | 87 | static irqreturn_t netxen_msix_intr(int irq, void *data); |
82 | 88 | ||
89 | static void netxen_config_indev_addr(struct net_device *dev, unsigned long); | ||
90 | |||
83 | /* PCI Device ID Table */ | 91 | /* PCI Device ID Table */ |
84 | #define ENTRY(device) \ | 92 | #define ENTRY(device) \ |
85 | {PCI_DEVICE(PCI_VENDOR_ID_NETXEN, (device)), \ | 93 | {PCI_DEVICE(PCI_VENDOR_ID_NETXEN, (device)), \ |
@@ -108,7 +116,7 @@ void | |||
108 | netxen_nic_update_cmd_producer(struct netxen_adapter *adapter, | 116 | netxen_nic_update_cmd_producer(struct netxen_adapter *adapter, |
109 | struct nx_host_tx_ring *tx_ring) | 117 | struct nx_host_tx_ring *tx_ring) |
110 | { | 118 | { |
111 | NXWR32(adapter, tx_ring->crb_cmd_producer, tx_ring->producer); | 119 | NXWRIO(adapter, tx_ring->crb_cmd_producer, tx_ring->producer); |
112 | 120 | ||
113 | if (netxen_tx_avail(tx_ring) <= TX_STOP_THRESH) { | 121 | if (netxen_tx_avail(tx_ring) <= TX_STOP_THRESH) { |
114 | netif_stop_queue(adapter->netdev); | 122 | netif_stop_queue(adapter->netdev); |
@@ -125,7 +133,7 @@ static inline void | |||
125 | netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter, | 133 | netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter, |
126 | struct nx_host_tx_ring *tx_ring) | 134 | struct nx_host_tx_ring *tx_ring) |
127 | { | 135 | { |
128 | NXWR32(adapter, tx_ring->crb_cmd_consumer, tx_ring->sw_consumer); | 136 | NXWRIO(adapter, tx_ring->crb_cmd_consumer, tx_ring->sw_consumer); |
129 | } | 137 | } |
130 | 138 | ||
131 | static uint32_t msi_tgt_status[8] = { | 139 | static uint32_t msi_tgt_status[8] = { |
@@ -141,18 +149,17 @@ static inline void netxen_nic_disable_int(struct nx_host_sds_ring *sds_ring) | |||
141 | { | 149 | { |
142 | struct netxen_adapter *adapter = sds_ring->adapter; | 150 | struct netxen_adapter *adapter = sds_ring->adapter; |
143 | 151 | ||
144 | NXWR32(adapter, sds_ring->crb_intr_mask, 0); | 152 | NXWRIO(adapter, sds_ring->crb_intr_mask, 0); |
145 | } | 153 | } |
146 | 154 | ||
147 | static inline void netxen_nic_enable_int(struct nx_host_sds_ring *sds_ring) | 155 | static inline void netxen_nic_enable_int(struct nx_host_sds_ring *sds_ring) |
148 | { | 156 | { |
149 | struct netxen_adapter *adapter = sds_ring->adapter; | 157 | struct netxen_adapter *adapter = sds_ring->adapter; |
150 | 158 | ||
151 | NXWR32(adapter, sds_ring->crb_intr_mask, 0x1); | 159 | NXWRIO(adapter, sds_ring->crb_intr_mask, 0x1); |
152 | 160 | ||
153 | if (!NETXEN_IS_MSI_FAMILY(adapter)) | 161 | if (!NETXEN_IS_MSI_FAMILY(adapter)) |
154 | adapter->pci_write_immediate(adapter, | 162 | NXWRIO(adapter, adapter->tgt_mask_reg, 0xfbff); |
155 | adapter->legacy_intr.tgt_mask_reg, 0xfbff); | ||
156 | } | 163 | } |
157 | 164 | ||
158 | static int | 165 | static int |
@@ -311,44 +318,6 @@ err_out: | |||
311 | return err; | 318 | return err; |
312 | } | 319 | } |
313 | 320 | ||
314 | static void | ||
315 | netxen_check_options(struct netxen_adapter *adapter) | ||
316 | { | ||
317 | if (adapter->ahw.port_type == NETXEN_NIC_XGBE) { | ||
318 | adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G; | ||
319 | adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; | ||
320 | } else if (adapter->ahw.port_type == NETXEN_NIC_GBE) { | ||
321 | adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G; | ||
322 | adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; | ||
323 | } | ||
324 | |||
325 | adapter->msix_supported = 0; | ||
326 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | ||
327 | adapter->msix_supported = !!use_msi_x; | ||
328 | adapter->rss_supported = !!use_msi_x; | ||
329 | } else if (adapter->fw_version >= NETXEN_VERSION_CODE(3, 4, 336)) { | ||
330 | switch (adapter->ahw.board_type) { | ||
331 | case NETXEN_BRDTYPE_P2_SB31_10G: | ||
332 | case NETXEN_BRDTYPE_P2_SB31_10G_CX4: | ||
333 | adapter->msix_supported = !!use_msi_x; | ||
334 | adapter->rss_supported = !!use_msi_x; | ||
335 | break; | ||
336 | default: | ||
337 | break; | ||
338 | } | ||
339 | } | ||
340 | |||
341 | adapter->num_txd = MAX_CMD_DESCRIPTORS; | ||
342 | |||
343 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | ||
344 | adapter->num_lro_rxd = MAX_LRO_RCV_DESCRIPTORS; | ||
345 | adapter->max_rds_rings = 3; | ||
346 | } else { | ||
347 | adapter->num_lro_rxd = 0; | ||
348 | adapter->max_rds_rings = 2; | ||
349 | } | ||
350 | } | ||
351 | |||
352 | static int | 321 | static int |
353 | netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot) | 322 | netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot) |
354 | { | 323 | { |
@@ -548,10 +517,22 @@ netxen_setup_intr(struct netxen_adapter *adapter) | |||
548 | legacy_intrp = &legacy_intr[adapter->ahw.pci_func]; | 517 | legacy_intrp = &legacy_intr[adapter->ahw.pci_func]; |
549 | else | 518 | else |
550 | legacy_intrp = &legacy_intr[0]; | 519 | legacy_intrp = &legacy_intr[0]; |
551 | adapter->legacy_intr.int_vec_bit = legacy_intrp->int_vec_bit; | 520 | |
552 | adapter->legacy_intr.tgt_status_reg = legacy_intrp->tgt_status_reg; | 521 | adapter->int_vec_bit = legacy_intrp->int_vec_bit; |
553 | adapter->legacy_intr.tgt_mask_reg = legacy_intrp->tgt_mask_reg; | 522 | adapter->tgt_status_reg = netxen_get_ioaddr(adapter, |
554 | adapter->legacy_intr.pci_int_reg = legacy_intrp->pci_int_reg; | 523 | legacy_intrp->tgt_status_reg); |
524 | adapter->tgt_mask_reg = netxen_get_ioaddr(adapter, | ||
525 | legacy_intrp->tgt_mask_reg); | ||
526 | adapter->pci_int_reg = netxen_get_ioaddr(adapter, | ||
527 | legacy_intrp->pci_int_reg); | ||
528 | adapter->isr_int_vec = netxen_get_ioaddr(adapter, ISR_INT_VECTOR); | ||
529 | |||
530 | if (adapter->ahw.revision_id >= NX_P3_B1) | ||
531 | adapter->crb_int_state_reg = netxen_get_ioaddr(adapter, | ||
532 | ISR_INT_STATE_REG); | ||
533 | else | ||
534 | adapter->crb_int_state_reg = netxen_get_ioaddr(adapter, | ||
535 | CRB_INT_VECTOR); | ||
555 | 536 | ||
556 | netxen_set_msix_bit(pdev, 0); | 537 | netxen_set_msix_bit(pdev, 0); |
557 | 538 | ||
@@ -578,8 +559,8 @@ netxen_setup_intr(struct netxen_adapter *adapter) | |||
578 | 559 | ||
579 | if (use_msi && !pci_enable_msi(pdev)) { | 560 | if (use_msi && !pci_enable_msi(pdev)) { |
580 | adapter->flags |= NETXEN_NIC_MSI_ENABLED; | 561 | adapter->flags |= NETXEN_NIC_MSI_ENABLED; |
581 | adapter->msi_tgt_status = | 562 | adapter->tgt_status_reg = netxen_get_ioaddr(adapter, |
582 | msi_tgt_status[adapter->ahw.pci_func]; | 563 | msi_tgt_status[adapter->ahw.pci_func]); |
583 | dev_info(&pdev->dev, "using msi interrupts\n"); | 564 | dev_info(&pdev->dev, "using msi interrupts\n"); |
584 | adapter->msix_entries[0].vector = pdev->irq; | 565 | adapter->msix_entries[0].vector = pdev->irq; |
585 | return; | 566 | return; |
@@ -639,14 +620,6 @@ netxen_setup_pci_map(struct netxen_adapter *adapter) | |||
639 | mem_len = pci_resource_len(pdev, 0); | 620 | mem_len = pci_resource_len(pdev, 0); |
640 | pci_len0 = 0; | 621 | pci_len0 = 0; |
641 | 622 | ||
642 | adapter->hw_write_wx = netxen_nic_hw_write_wx_128M; | ||
643 | adapter->hw_read_wx = netxen_nic_hw_read_wx_128M; | ||
644 | adapter->pci_read_immediate = netxen_nic_pci_read_immediate_128M; | ||
645 | adapter->pci_write_immediate = netxen_nic_pci_write_immediate_128M; | ||
646 | adapter->pci_set_window = netxen_nic_pci_set_window_128M; | ||
647 | adapter->pci_mem_read = netxen_nic_pci_mem_read_128M; | ||
648 | adapter->pci_mem_write = netxen_nic_pci_mem_write_128M; | ||
649 | |||
650 | /* 128 Meg of memory */ | 623 | /* 128 Meg of memory */ |
651 | if (mem_len == NETXEN_PCI_128MB_SIZE) { | 624 | if (mem_len == NETXEN_PCI_128MB_SIZE) { |
652 | mem_ptr0 = ioremap(mem_base, FIRST_PAGE_GROUP_SIZE); | 625 | mem_ptr0 = ioremap(mem_base, FIRST_PAGE_GROUP_SIZE); |
@@ -659,14 +632,6 @@ netxen_setup_pci_map(struct netxen_adapter *adapter) | |||
659 | mem_ptr2 = ioremap(mem_base + THIRD_PAGE_GROUP_START - | 632 | mem_ptr2 = ioremap(mem_base + THIRD_PAGE_GROUP_START - |
660 | SECOND_PAGE_GROUP_START, THIRD_PAGE_GROUP_SIZE); | 633 | SECOND_PAGE_GROUP_START, THIRD_PAGE_GROUP_SIZE); |
661 | } else if (mem_len == NETXEN_PCI_2MB_SIZE) { | 634 | } else if (mem_len == NETXEN_PCI_2MB_SIZE) { |
662 | adapter->hw_write_wx = netxen_nic_hw_write_wx_2M; | ||
663 | adapter->hw_read_wx = netxen_nic_hw_read_wx_2M; | ||
664 | adapter->pci_read_immediate = netxen_nic_pci_read_immediate_2M; | ||
665 | adapter->pci_write_immediate = | ||
666 | netxen_nic_pci_write_immediate_2M; | ||
667 | adapter->pci_set_window = netxen_nic_pci_set_window_2M; | ||
668 | adapter->pci_mem_read = netxen_nic_pci_mem_read_2M; | ||
669 | adapter->pci_mem_write = netxen_nic_pci_mem_write_2M; | ||
670 | 635 | ||
671 | mem_ptr0 = pci_ioremap_bar(pdev, 0); | 636 | mem_ptr0 = pci_ioremap_bar(pdev, 0); |
672 | if (mem_ptr0 == NULL) { | 637 | if (mem_ptr0 == NULL) { |
@@ -690,6 +655,8 @@ netxen_setup_pci_map(struct netxen_adapter *adapter) | |||
690 | return -EIO; | 655 | return -EIO; |
691 | } | 656 | } |
692 | 657 | ||
658 | netxen_setup_hwops(adapter); | ||
659 | |||
693 | dev_info(&pdev->dev, "%dMB memory map\n", (int)(mem_len>>20)); | 660 | dev_info(&pdev->dev, "%dMB memory map\n", (int)(mem_len>>20)); |
694 | 661 | ||
695 | adapter->ahw.pci_base0 = mem_ptr0; | 662 | adapter->ahw.pci_base0 = mem_ptr0; |
@@ -728,20 +695,111 @@ err_out: | |||
728 | return err; | 695 | return err; |
729 | } | 696 | } |
730 | 697 | ||
698 | static void | ||
699 | netxen_check_options(struct netxen_adapter *adapter) | ||
700 | { | ||
701 | u32 fw_major, fw_minor, fw_build; | ||
702 | char brd_name[NETXEN_MAX_SHORT_NAME]; | ||
703 | char serial_num[32]; | ||
704 | int i, offset, val; | ||
705 | int *ptr32; | ||
706 | struct pci_dev *pdev = adapter->pdev; | ||
707 | |||
708 | adapter->driver_mismatch = 0; | ||
709 | |||
710 | ptr32 = (int *)&serial_num; | ||
711 | offset = NX_FW_SERIAL_NUM_OFFSET; | ||
712 | for (i = 0; i < 8; i++) { | ||
713 | if (netxen_rom_fast_read(adapter, offset, &val) == -1) { | ||
714 | dev_err(&pdev->dev, "error reading board info\n"); | ||
715 | adapter->driver_mismatch = 1; | ||
716 | return; | ||
717 | } | ||
718 | ptr32[i] = cpu_to_le32(val); | ||
719 | offset += sizeof(u32); | ||
720 | } | ||
721 | |||
722 | fw_major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR); | ||
723 | fw_minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR); | ||
724 | fw_build = NXRD32(adapter, NETXEN_FW_VERSION_SUB); | ||
725 | |||
726 | adapter->fw_version = NETXEN_VERSION_CODE(fw_major, fw_minor, fw_build); | ||
727 | |||
728 | if (adapter->portnum == 0) { | ||
729 | get_brd_name_by_type(adapter->ahw.board_type, brd_name); | ||
730 | |||
731 | printk(KERN_INFO "NetXen %s Board S/N %s Chip rev 0x%x\n", | ||
732 | brd_name, serial_num, adapter->ahw.revision_id); | ||
733 | } | ||
734 | |||
735 | if (adapter->fw_version < NETXEN_VERSION_CODE(3, 4, 216)) { | ||
736 | adapter->driver_mismatch = 1; | ||
737 | dev_warn(&pdev->dev, "firmware version %d.%d.%d unsupported\n", | ||
738 | fw_major, fw_minor, fw_build); | ||
739 | return; | ||
740 | } | ||
741 | |||
742 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | ||
743 | i = NXRD32(adapter, NETXEN_SRE_MISC); | ||
744 | adapter->ahw.cut_through = (i & 0x8000) ? 1 : 0; | ||
745 | } | ||
746 | |||
747 | dev_info(&pdev->dev, "firmware v%d.%d.%d [%s]\n", | ||
748 | fw_major, fw_minor, fw_build, | ||
749 | adapter->ahw.cut_through ? "cut-through" : "legacy"); | ||
750 | |||
751 | if (adapter->fw_version >= NETXEN_VERSION_CODE(4, 0, 222)) | ||
752 | adapter->capabilities = NXRD32(adapter, CRB_FW_CAPABILITIES_1); | ||
753 | |||
754 | adapter->flags &= ~NETXEN_NIC_LRO_ENABLED; | ||
755 | |||
756 | if (adapter->ahw.port_type == NETXEN_NIC_XGBE) { | ||
757 | adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G; | ||
758 | adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; | ||
759 | } else if (adapter->ahw.port_type == NETXEN_NIC_GBE) { | ||
760 | adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G; | ||
761 | adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; | ||
762 | } | ||
763 | |||
764 | adapter->msix_supported = 0; | ||
765 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | ||
766 | adapter->msix_supported = !!use_msi_x; | ||
767 | adapter->rss_supported = !!use_msi_x; | ||
768 | } else if (adapter->fw_version >= NETXEN_VERSION_CODE(3, 4, 336)) { | ||
769 | switch (adapter->ahw.board_type) { | ||
770 | case NETXEN_BRDTYPE_P2_SB31_10G: | ||
771 | case NETXEN_BRDTYPE_P2_SB31_10G_CX4: | ||
772 | adapter->msix_supported = !!use_msi_x; | ||
773 | adapter->rss_supported = !!use_msi_x; | ||
774 | break; | ||
775 | default: | ||
776 | break; | ||
777 | } | ||
778 | } | ||
779 | |||
780 | adapter->num_txd = MAX_CMD_DESCRIPTORS; | ||
781 | |||
782 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | ||
783 | adapter->num_lro_rxd = MAX_LRO_RCV_DESCRIPTORS; | ||
784 | adapter->max_rds_rings = 3; | ||
785 | } else { | ||
786 | adapter->num_lro_rxd = 0; | ||
787 | adapter->max_rds_rings = 2; | ||
788 | } | ||
789 | } | ||
790 | |||
731 | static int | 791 | static int |
732 | netxen_start_firmware(struct netxen_adapter *adapter, int request_fw) | 792 | netxen_start_firmware(struct netxen_adapter *adapter) |
733 | { | 793 | { |
734 | int val, err, first_boot; | 794 | int val, err, first_boot; |
735 | struct pci_dev *pdev = adapter->pdev; | 795 | struct pci_dev *pdev = adapter->pdev; |
736 | 796 | ||
737 | int first_driver = 0; | 797 | /* required for NX2031 dummy dma */ |
738 | 798 | err = nx_set_dma_mask(adapter); | |
739 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) | 799 | if (err) |
740 | first_driver = (adapter->portnum == 0); | 800 | return err; |
741 | else | ||
742 | first_driver = (adapter->ahw.pci_func == 0); | ||
743 | 801 | ||
744 | if (!first_driver) | 802 | if (!netxen_can_start_firmware(adapter)) |
745 | goto wait_init; | 803 | goto wait_init; |
746 | 804 | ||
747 | first_boot = NXRD32(adapter, NETXEN_CAM_RAM(0x1fc)); | 805 | first_boot = NXRD32(adapter, NETXEN_CAM_RAM(0x1fc)); |
@@ -752,12 +810,11 @@ netxen_start_firmware(struct netxen_adapter *adapter, int request_fw) | |||
752 | return err; | 810 | return err; |
753 | } | 811 | } |
754 | 812 | ||
755 | if (request_fw) | 813 | netxen_request_firmware(adapter); |
756 | netxen_request_firmware(adapter); | ||
757 | 814 | ||
758 | err = netxen_need_fw_reset(adapter); | 815 | err = netxen_need_fw_reset(adapter); |
759 | if (err < 0) | 816 | if (err < 0) |
760 | return err; | 817 | goto err_out; |
761 | if (err == 0) | 818 | if (err == 0) |
762 | goto wait_init; | 819 | goto wait_init; |
763 | 820 | ||
@@ -768,10 +825,17 @@ netxen_start_firmware(struct netxen_adapter *adapter, int request_fw) | |||
768 | } | 825 | } |
769 | 826 | ||
770 | NXWR32(adapter, CRB_DMA_SHIFT, 0x55555555); | 827 | NXWR32(adapter, CRB_DMA_SHIFT, 0x55555555); |
828 | NXWR32(adapter, NETXEN_PEG_HALT_STATUS1, 0); | ||
829 | NXWR32(adapter, NETXEN_PEG_HALT_STATUS2, 0); | ||
830 | |||
771 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) | 831 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) |
772 | netxen_set_port_mode(adapter); | 832 | netxen_set_port_mode(adapter); |
773 | 833 | ||
774 | netxen_load_firmware(adapter); | 834 | err = netxen_load_firmware(adapter); |
835 | if (err) | ||
836 | goto err_out; | ||
837 | |||
838 | netxen_release_firmware(adapter); | ||
775 | 839 | ||
776 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | 840 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { |
777 | 841 | ||
@@ -785,7 +849,7 @@ netxen_start_firmware(struct netxen_adapter *adapter, int request_fw) | |||
785 | 849 | ||
786 | err = netxen_init_dummy_dma(adapter); | 850 | err = netxen_init_dummy_dma(adapter); |
787 | if (err) | 851 | if (err) |
788 | return err; | 852 | goto err_out; |
789 | 853 | ||
790 | /* | 854 | /* |
791 | * Tell the hardware our version number. | 855 | * Tell the hardware our version number. |
@@ -795,19 +859,25 @@ netxen_start_firmware(struct netxen_adapter *adapter, int request_fw) | |||
795 | | (_NETXEN_NIC_LINUX_SUBVERSION); | 859 | | (_NETXEN_NIC_LINUX_SUBVERSION); |
796 | NXWR32(adapter, CRB_DRIVER_VERSION, val); | 860 | NXWR32(adapter, CRB_DRIVER_VERSION, val); |
797 | 861 | ||
862 | NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_READY); | ||
863 | |||
798 | wait_init: | 864 | wait_init: |
799 | /* Handshake with the card before we register the devices. */ | 865 | /* Handshake with the card before we register the devices. */ |
800 | err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); | 866 | err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); |
801 | if (err) { | 867 | if (err) { |
802 | netxen_free_dummy_dma(adapter); | 868 | netxen_free_dummy_dma(adapter); |
803 | return err; | 869 | goto err_out; |
804 | } | 870 | } |
805 | 871 | ||
806 | nx_update_dma_mask(adapter); | 872 | nx_update_dma_mask(adapter); |
807 | 873 | ||
808 | netxen_nic_get_firmware_info(adapter); | 874 | netxen_check_options(adapter); |
809 | 875 | ||
810 | return 0; | 876 | return 0; |
877 | |||
878 | err_out: | ||
879 | netxen_release_firmware(adapter); | ||
880 | return err; | ||
811 | } | 881 | } |
812 | 882 | ||
813 | static int | 883 | static int |
@@ -876,6 +946,9 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev) | |||
876 | { | 946 | { |
877 | int err; | 947 | int err; |
878 | 948 | ||
949 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) | ||
950 | return -EIO; | ||
951 | |||
879 | err = adapter->init_port(adapter, adapter->physical_port); | 952 | err = adapter->init_port(adapter, adapter->physical_port); |
880 | if (err) { | 953 | if (err) { |
881 | printk(KERN_ERR "%s: Failed to initialize port %d\n", | 954 | printk(KERN_ERR "%s: Failed to initialize port %d\n", |
@@ -906,14 +979,18 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev) | |||
906 | else | 979 | else |
907 | netxen_nic_set_link_parameters(adapter); | 980 | netxen_nic_set_link_parameters(adapter); |
908 | 981 | ||
909 | mod_timer(&adapter->watchdog_timer, jiffies); | 982 | set_bit(__NX_DEV_UP, &adapter->state); |
910 | |||
911 | return 0; | 983 | return 0; |
912 | } | 984 | } |
913 | 985 | ||
914 | static void | 986 | static void |
915 | netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) | 987 | netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) |
916 | { | 988 | { |
989 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) | ||
990 | return; | ||
991 | |||
992 | clear_bit(__NX_DEV_UP, &adapter->state); | ||
993 | |||
917 | spin_lock(&adapter->tx_clean_lock); | 994 | spin_lock(&adapter->tx_clean_lock); |
918 | netif_carrier_off(netdev); | 995 | netif_carrier_off(netdev); |
919 | netif_tx_disable(netdev); | 996 | netif_tx_disable(netdev); |
@@ -930,8 +1007,6 @@ netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) | |||
930 | 1007 | ||
931 | netxen_release_tx_buffers(adapter); | 1008 | netxen_release_tx_buffers(adapter); |
932 | spin_unlock(&adapter->tx_clean_lock); | 1009 | spin_unlock(&adapter->tx_clean_lock); |
933 | |||
934 | del_timer_sync(&adapter->watchdog_timer); | ||
935 | } | 1010 | } |
936 | 1011 | ||
937 | 1012 | ||
@@ -962,8 +1037,6 @@ netxen_nic_attach(struct netxen_adapter *adapter) | |||
962 | return err; | 1037 | return err; |
963 | } | 1038 | } |
964 | 1039 | ||
965 | netxen_nic_clear_stats(adapter); | ||
966 | |||
967 | err = netxen_alloc_hw_resources(adapter); | 1040 | err = netxen_alloc_hw_resources(adapter); |
968 | if (err) { | 1041 | if (err) { |
969 | printk(KERN_ERR "%s: Error in setting hw resources\n", | 1042 | printk(KERN_ERR "%s: Error in setting hw resources\n", |
@@ -973,8 +1046,10 @@ netxen_nic_attach(struct netxen_adapter *adapter) | |||
973 | 1046 | ||
974 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | 1047 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { |
975 | tx_ring = adapter->tx_ring; | 1048 | tx_ring = adapter->tx_ring; |
976 | tx_ring->crb_cmd_producer = crb_cmd_producer[adapter->portnum]; | 1049 | tx_ring->crb_cmd_producer = netxen_get_ioaddr(adapter, |
977 | tx_ring->crb_cmd_consumer = crb_cmd_consumer[adapter->portnum]; | 1050 | crb_cmd_producer[adapter->portnum]); |
1051 | tx_ring->crb_cmd_consumer = netxen_get_ioaddr(adapter, | ||
1052 | crb_cmd_consumer[adapter->portnum]); | ||
978 | 1053 | ||
979 | tx_ring->producer = 0; | 1054 | tx_ring->producer = 0; |
980 | tx_ring->sw_consumer = 0; | 1055 | tx_ring->sw_consumer = 0; |
@@ -1034,21 +1109,32 @@ netxen_nic_reset_context(struct netxen_adapter *adapter) | |||
1034 | int err = 0; | 1109 | int err = 0; |
1035 | struct net_device *netdev = adapter->netdev; | 1110 | struct net_device *netdev = adapter->netdev; |
1036 | 1111 | ||
1112 | if (test_and_set_bit(__NX_RESETTING, &adapter->state)) | ||
1113 | return -EBUSY; | ||
1114 | |||
1037 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { | 1115 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { |
1038 | 1116 | ||
1117 | netif_device_detach(netdev); | ||
1118 | |||
1039 | if (netif_running(netdev)) | 1119 | if (netif_running(netdev)) |
1040 | netxen_nic_down(adapter, netdev); | 1120 | netxen_nic_down(adapter, netdev); |
1041 | 1121 | ||
1042 | netxen_nic_detach(adapter); | 1122 | netxen_nic_detach(adapter); |
1043 | 1123 | ||
1044 | err = netxen_nic_attach(adapter); | 1124 | if (netif_running(netdev)) { |
1045 | if (err) | 1125 | err = netxen_nic_attach(adapter); |
1046 | goto done; | 1126 | if (!err) |
1127 | err = netxen_nic_up(adapter, netdev); | ||
1047 | 1128 | ||
1048 | if (netif_running(netdev)) | 1129 | if (err) |
1049 | err = netxen_nic_up(adapter, netdev); | 1130 | goto done; |
1131 | } | ||
1132 | |||
1133 | netif_device_attach(netdev); | ||
1050 | } | 1134 | } |
1135 | |||
1051 | done: | 1136 | done: |
1137 | clear_bit(__NX_RESETTING, &adapter->state); | ||
1052 | return err; | 1138 | return err; |
1053 | } | 1139 | } |
1054 | 1140 | ||
@@ -1095,10 +1181,6 @@ netxen_setup_netdev(struct netxen_adapter *adapter, | |||
1095 | 1181 | ||
1096 | netdev->irq = adapter->msix_entries[0].vector; | 1182 | netdev->irq = adapter->msix_entries[0].vector; |
1097 | 1183 | ||
1098 | init_timer(&adapter->watchdog_timer); | ||
1099 | adapter->watchdog_timer.function = &netxen_watchdog; | ||
1100 | adapter->watchdog_timer.data = (unsigned long)adapter; | ||
1101 | INIT_WORK(&adapter->watchdog_task, netxen_watchdog_task); | ||
1102 | INIT_WORK(&adapter->tx_timeout_task, netxen_reset_task); | 1184 | INIT_WORK(&adapter->tx_timeout_task, netxen_reset_task); |
1103 | 1185 | ||
1104 | if (netxen_read_mac_addr(adapter)) | 1186 | if (netxen_read_mac_addr(adapter)) |
@@ -1168,10 +1250,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1168 | revision_id = pdev->revision; | 1250 | revision_id = pdev->revision; |
1169 | adapter->ahw.revision_id = revision_id; | 1251 | adapter->ahw.revision_id = revision_id; |
1170 | 1252 | ||
1171 | err = nx_set_dma_mask(adapter); | ||
1172 | if (err) | ||
1173 | goto err_out_free_netdev; | ||
1174 | |||
1175 | rwlock_init(&adapter->adapter_lock); | 1253 | rwlock_init(&adapter->adapter_lock); |
1176 | spin_lock_init(&adapter->tx_clean_lock); | 1254 | spin_lock_init(&adapter->tx_clean_lock); |
1177 | INIT_LIST_HEAD(&adapter->mac_list); | 1255 | INIT_LIST_HEAD(&adapter->mac_list); |
@@ -1189,8 +1267,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1189 | goto err_out_iounmap; | 1267 | goto err_out_iounmap; |
1190 | } | 1268 | } |
1191 | 1269 | ||
1192 | netxen_initialize_adapter_ops(adapter); | ||
1193 | |||
1194 | /* Mezz cards have PCI function 0,2,3 enabled */ | 1270 | /* Mezz cards have PCI function 0,2,3 enabled */ |
1195 | switch (adapter->ahw.board_type) { | 1271 | switch (adapter->ahw.board_type) { |
1196 | case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ: | 1272 | case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ: |
@@ -1202,7 +1278,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1202 | break; | 1278 | break; |
1203 | } | 1279 | } |
1204 | 1280 | ||
1205 | err = netxen_start_firmware(adapter, 1); | 1281 | err = netxen_start_firmware(adapter); |
1206 | if (err) | 1282 | if (err) |
1207 | goto err_out_iounmap; | 1283 | goto err_out_iounmap; |
1208 | 1284 | ||
@@ -1216,7 +1292,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1216 | adapter->physical_port = i; | 1292 | adapter->physical_port = i; |
1217 | } | 1293 | } |
1218 | 1294 | ||
1219 | netxen_check_options(adapter); | 1295 | netxen_nic_clear_stats(adapter); |
1220 | 1296 | ||
1221 | netxen_setup_intr(adapter); | 1297 | netxen_setup_intr(adapter); |
1222 | 1298 | ||
@@ -1226,6 +1302,8 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1226 | 1302 | ||
1227 | pci_set_drvdata(pdev, adapter); | 1303 | pci_set_drvdata(pdev, adapter); |
1228 | 1304 | ||
1305 | netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY); | ||
1306 | |||
1229 | switch (adapter->ahw.port_type) { | 1307 | switch (adapter->ahw.port_type) { |
1230 | case NETXEN_NIC_GBE: | 1308 | case NETXEN_NIC_GBE: |
1231 | dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n", | 1309 | dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n", |
@@ -1244,6 +1322,8 @@ err_out_disable_msi: | |||
1244 | 1322 | ||
1245 | netxen_free_dummy_dma(adapter); | 1323 | netxen_free_dummy_dma(adapter); |
1246 | 1324 | ||
1325 | nx_decr_dev_ref_cnt(adapter); | ||
1326 | |||
1247 | err_out_iounmap: | 1327 | err_out_iounmap: |
1248 | netxen_cleanup_pci_map(adapter); | 1328 | netxen_cleanup_pci_map(adapter); |
1249 | 1329 | ||
@@ -1270,16 +1350,21 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
1270 | 1350 | ||
1271 | netdev = adapter->netdev; | 1351 | netdev = adapter->netdev; |
1272 | 1352 | ||
1353 | netxen_cancel_fw_work(adapter); | ||
1354 | |||
1273 | unregister_netdev(netdev); | 1355 | unregister_netdev(netdev); |
1274 | 1356 | ||
1275 | cancel_work_sync(&adapter->watchdog_task); | ||
1276 | cancel_work_sync(&adapter->tx_timeout_task); | 1357 | cancel_work_sync(&adapter->tx_timeout_task); |
1277 | 1358 | ||
1278 | netxen_nic_detach(adapter); | 1359 | netxen_nic_detach(adapter); |
1279 | 1360 | ||
1361 | nx_decr_dev_ref_cnt(adapter); | ||
1362 | |||
1280 | if (adapter->portnum == 0) | 1363 | if (adapter->portnum == 0) |
1281 | netxen_free_dummy_dma(adapter); | 1364 | netxen_free_dummy_dma(adapter); |
1282 | 1365 | ||
1366 | clear_bit(__NX_RESETTING, &adapter->state); | ||
1367 | |||
1283 | netxen_teardown_intr(adapter); | 1368 | netxen_teardown_intr(adapter); |
1284 | 1369 | ||
1285 | netxen_cleanup_pci_map(adapter); | 1370 | netxen_cleanup_pci_map(adapter); |
@@ -1300,10 +1385,11 @@ static int __netxen_nic_shutdown(struct pci_dev *pdev) | |||
1300 | 1385 | ||
1301 | netif_device_detach(netdev); | 1386 | netif_device_detach(netdev); |
1302 | 1387 | ||
1388 | netxen_cancel_fw_work(adapter); | ||
1389 | |||
1303 | if (netif_running(netdev)) | 1390 | if (netif_running(netdev)) |
1304 | netxen_nic_down(adapter, netdev); | 1391 | netxen_nic_down(adapter, netdev); |
1305 | 1392 | ||
1306 | cancel_work_sync(&adapter->watchdog_task); | ||
1307 | cancel_work_sync(&adapter->tx_timeout_task); | 1393 | cancel_work_sync(&adapter->tx_timeout_task); |
1308 | 1394 | ||
1309 | netxen_nic_detach(adapter); | 1395 | netxen_nic_detach(adapter); |
@@ -1311,6 +1397,10 @@ static int __netxen_nic_shutdown(struct pci_dev *pdev) | |||
1311 | if (adapter->portnum == 0) | 1397 | if (adapter->portnum == 0) |
1312 | netxen_free_dummy_dma(adapter); | 1398 | netxen_free_dummy_dma(adapter); |
1313 | 1399 | ||
1400 | nx_decr_dev_ref_cnt(adapter); | ||
1401 | |||
1402 | clear_bit(__NX_RESETTING, &adapter->state); | ||
1403 | |||
1314 | retval = pci_save_state(pdev); | 1404 | retval = pci_save_state(pdev); |
1315 | if (retval) | 1405 | if (retval) |
1316 | return retval; | 1406 | return retval; |
@@ -1359,7 +1449,7 @@ netxen_nic_resume(struct pci_dev *pdev) | |||
1359 | 1449 | ||
1360 | adapter->curr_window = 255; | 1450 | adapter->curr_window = 255; |
1361 | 1451 | ||
1362 | err = netxen_start_firmware(adapter, 0); | 1452 | err = netxen_start_firmware(adapter); |
1363 | if (err) { | 1453 | if (err) { |
1364 | dev_err(&pdev->dev, "failed to start firmware\n"); | 1454 | dev_err(&pdev->dev, "failed to start firmware\n"); |
1365 | return err; | 1455 | return err; |
@@ -1368,16 +1458,24 @@ netxen_nic_resume(struct pci_dev *pdev) | |||
1368 | if (netif_running(netdev)) { | 1458 | if (netif_running(netdev)) { |
1369 | err = netxen_nic_attach(adapter); | 1459 | err = netxen_nic_attach(adapter); |
1370 | if (err) | 1460 | if (err) |
1371 | return err; | 1461 | goto err_out; |
1372 | 1462 | ||
1373 | err = netxen_nic_up(adapter, netdev); | 1463 | err = netxen_nic_up(adapter, netdev); |
1374 | if (err) | 1464 | if (err) |
1375 | return err; | 1465 | goto err_out_detach; |
1376 | 1466 | ||
1377 | netif_device_attach(netdev); | 1467 | netif_device_attach(netdev); |
1468 | |||
1469 | netxen_config_indev_addr(netdev, NETDEV_UP); | ||
1378 | } | 1470 | } |
1379 | 1471 | ||
1380 | return 0; | 1472 | netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY); |
1473 | |||
1474 | err_out_detach: | ||
1475 | netxen_nic_detach(adapter); | ||
1476 | err_out: | ||
1477 | nx_decr_dev_ref_cnt(adapter); | ||
1478 | return err; | ||
1381 | } | 1479 | } |
1382 | #endif | 1480 | #endif |
1383 | 1481 | ||
@@ -1771,59 +1869,13 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter) | |||
1771 | netxen_advert_link_change(adapter, linkup); | 1869 | netxen_advert_link_change(adapter, linkup); |
1772 | } | 1870 | } |
1773 | 1871 | ||
1774 | static void netxen_nic_thermal_shutdown(struct netxen_adapter *adapter) | ||
1775 | { | ||
1776 | struct net_device *netdev = adapter->netdev; | ||
1777 | |||
1778 | netif_device_detach(netdev); | ||
1779 | netxen_nic_down(adapter, netdev); | ||
1780 | netxen_nic_detach(adapter); | ||
1781 | } | ||
1782 | |||
1783 | static void netxen_watchdog(unsigned long v) | ||
1784 | { | ||
1785 | struct netxen_adapter *adapter = (struct netxen_adapter *)v; | ||
1786 | |||
1787 | if (netxen_nic_check_temp(adapter)) | ||
1788 | goto do_sched; | ||
1789 | |||
1790 | if (!adapter->has_link_events) { | ||
1791 | netxen_nic_handle_phy_intr(adapter); | ||
1792 | |||
1793 | if (adapter->link_changed) | ||
1794 | goto do_sched; | ||
1795 | } | ||
1796 | |||
1797 | if (netif_running(adapter->netdev)) | ||
1798 | mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); | ||
1799 | |||
1800 | return; | ||
1801 | |||
1802 | do_sched: | ||
1803 | schedule_work(&adapter->watchdog_task); | ||
1804 | } | ||
1805 | |||
1806 | void netxen_watchdog_task(struct work_struct *work) | ||
1807 | { | ||
1808 | struct netxen_adapter *adapter = | ||
1809 | container_of(work, struct netxen_adapter, watchdog_task); | ||
1810 | |||
1811 | if (adapter->temp == NX_TEMP_PANIC) { | ||
1812 | netxen_nic_thermal_shutdown(adapter); | ||
1813 | return; | ||
1814 | } | ||
1815 | |||
1816 | if (adapter->link_changed) | ||
1817 | netxen_nic_set_link_parameters(adapter); | ||
1818 | |||
1819 | if (netif_running(adapter->netdev)) | ||
1820 | mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); | ||
1821 | } | ||
1822 | |||
1823 | static void netxen_tx_timeout(struct net_device *netdev) | 1872 | static void netxen_tx_timeout(struct net_device *netdev) |
1824 | { | 1873 | { |
1825 | struct netxen_adapter *adapter = netdev_priv(netdev); | 1874 | struct netxen_adapter *adapter = netdev_priv(netdev); |
1826 | 1875 | ||
1876 | if (test_bit(__NX_RESETTING, &adapter->state)) | ||
1877 | return; | ||
1878 | |||
1827 | dev_err(&netdev->dev, "transmit timeout, resetting.\n"); | 1879 | dev_err(&netdev->dev, "transmit timeout, resetting.\n"); |
1828 | schedule_work(&adapter->tx_timeout_task); | 1880 | schedule_work(&adapter->tx_timeout_task); |
1829 | } | 1881 | } |
@@ -1836,6 +1888,9 @@ static void netxen_reset_task(struct work_struct *work) | |||
1836 | if (!netif_running(adapter->netdev)) | 1888 | if (!netif_running(adapter->netdev)) |
1837 | return; | 1889 | return; |
1838 | 1890 | ||
1891 | if (test_bit(__NX_RESETTING, &adapter->state)) | ||
1892 | return; | ||
1893 | |||
1839 | netxen_napi_disable(adapter); | 1894 | netxen_napi_disable(adapter); |
1840 | 1895 | ||
1841 | adapter->netdev->trans_start = jiffies; | 1896 | adapter->netdev->trans_start = jiffies; |
@@ -1867,41 +1922,37 @@ static irqreturn_t netxen_intr(int irq, void *data) | |||
1867 | struct netxen_adapter *adapter = sds_ring->adapter; | 1922 | struct netxen_adapter *adapter = sds_ring->adapter; |
1868 | u32 status = 0; | 1923 | u32 status = 0; |
1869 | 1924 | ||
1870 | status = adapter->pci_read_immediate(adapter, ISR_INT_VECTOR); | 1925 | status = readl(adapter->isr_int_vec); |
1871 | 1926 | ||
1872 | if (!(status & adapter->legacy_intr.int_vec_bit)) | 1927 | if (!(status & adapter->int_vec_bit)) |
1873 | return IRQ_NONE; | 1928 | return IRQ_NONE; |
1874 | 1929 | ||
1875 | if (adapter->ahw.revision_id >= NX_P3_B1) { | 1930 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { |
1876 | /* check interrupt state machine, to be sure */ | 1931 | /* check interrupt state machine, to be sure */ |
1877 | status = adapter->pci_read_immediate(adapter, | 1932 | status = readl(adapter->crb_int_state_reg); |
1878 | ISR_INT_STATE_REG); | ||
1879 | if (!ISR_LEGACY_INT_TRIGGERED(status)) | 1933 | if (!ISR_LEGACY_INT_TRIGGERED(status)) |
1880 | return IRQ_NONE; | 1934 | return IRQ_NONE; |
1881 | 1935 | ||
1882 | } else { | 1936 | } else { |
1883 | unsigned long our_int = 0; | 1937 | unsigned long our_int = 0; |
1884 | 1938 | ||
1885 | our_int = NXRD32(adapter, CRB_INT_VECTOR); | 1939 | our_int = readl(adapter->crb_int_state_reg); |
1886 | 1940 | ||
1887 | /* not our interrupt */ | 1941 | /* not our interrupt */ |
1888 | if (!test_and_clear_bit((7 + adapter->portnum), &our_int)) | 1942 | if (!test_and_clear_bit((7 + adapter->portnum), &our_int)) |
1889 | return IRQ_NONE; | 1943 | return IRQ_NONE; |
1890 | 1944 | ||
1891 | /* claim interrupt */ | 1945 | /* claim interrupt */ |
1892 | NXWR32(adapter, CRB_INT_VECTOR, (our_int & 0xffffffff)); | 1946 | writel((our_int & 0xffffffff), adapter->crb_int_state_reg); |
1893 | } | ||
1894 | 1947 | ||
1895 | /* clear interrupt */ | 1948 | /* clear interrupt */ |
1896 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) | ||
1897 | netxen_nic_disable_int(sds_ring); | 1949 | netxen_nic_disable_int(sds_ring); |
1950 | } | ||
1898 | 1951 | ||
1899 | adapter->pci_write_immediate(adapter, | 1952 | writel(0xffffffff, adapter->tgt_status_reg); |
1900 | adapter->legacy_intr.tgt_status_reg, | ||
1901 | 0xffffffff); | ||
1902 | /* read twice to ensure write is flushed */ | 1953 | /* read twice to ensure write is flushed */ |
1903 | adapter->pci_read_immediate(adapter, ISR_INT_VECTOR); | 1954 | readl(adapter->isr_int_vec); |
1904 | adapter->pci_read_immediate(adapter, ISR_INT_VECTOR); | 1955 | readl(adapter->isr_int_vec); |
1905 | 1956 | ||
1906 | napi_schedule(&sds_ring->napi); | 1957 | napi_schedule(&sds_ring->napi); |
1907 | 1958 | ||
@@ -1914,8 +1965,7 @@ static irqreturn_t netxen_msi_intr(int irq, void *data) | |||
1914 | struct netxen_adapter *adapter = sds_ring->adapter; | 1965 | struct netxen_adapter *adapter = sds_ring->adapter; |
1915 | 1966 | ||
1916 | /* clear interrupt */ | 1967 | /* clear interrupt */ |
1917 | adapter->pci_write_immediate(adapter, | 1968 | writel(0xffffffff, adapter->tgt_status_reg); |
1918 | adapter->msi_tgt_status, 0xffffffff); | ||
1919 | 1969 | ||
1920 | napi_schedule(&sds_ring->napi); | 1970 | napi_schedule(&sds_ring->napi); |
1921 | return IRQ_HANDLED; | 1971 | return IRQ_HANDLED; |
@@ -1962,6 +2012,240 @@ static void netxen_nic_poll_controller(struct net_device *netdev) | |||
1962 | } | 2012 | } |
1963 | #endif | 2013 | #endif |
1964 | 2014 | ||
2015 | static int | ||
2016 | nx_incr_dev_ref_cnt(struct netxen_adapter *adapter) | ||
2017 | { | ||
2018 | int count; | ||
2019 | if (netxen_api_lock(adapter)) | ||
2020 | return -EIO; | ||
2021 | |||
2022 | count = NXRD32(adapter, NX_CRB_DEV_REF_COUNT); | ||
2023 | |||
2024 | NXWR32(adapter, NX_CRB_DEV_REF_COUNT, ++count); | ||
2025 | |||
2026 | netxen_api_unlock(adapter); | ||
2027 | return count; | ||
2028 | } | ||
2029 | |||
2030 | static int | ||
2031 | nx_decr_dev_ref_cnt(struct netxen_adapter *adapter) | ||
2032 | { | ||
2033 | int count; | ||
2034 | if (netxen_api_lock(adapter)) | ||
2035 | return -EIO; | ||
2036 | |||
2037 | count = NXRD32(adapter, NX_CRB_DEV_REF_COUNT); | ||
2038 | WARN_ON(count == 0); | ||
2039 | |||
2040 | NXWR32(adapter, NX_CRB_DEV_REF_COUNT, --count); | ||
2041 | |||
2042 | if (count == 0) | ||
2043 | NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_COLD); | ||
2044 | |||
2045 | netxen_api_unlock(adapter); | ||
2046 | return count; | ||
2047 | } | ||
2048 | |||
2049 | static int | ||
2050 | netxen_can_start_firmware(struct netxen_adapter *adapter) | ||
2051 | { | ||
2052 | int count; | ||
2053 | int can_start = 0; | ||
2054 | |||
2055 | if (netxen_api_lock(adapter)) | ||
2056 | return 0; | ||
2057 | |||
2058 | count = NXRD32(adapter, NX_CRB_DEV_REF_COUNT); | ||
2059 | |||
2060 | if ((count < 0) || (count >= NX_MAX_PCI_FUNC)) | ||
2061 | count = 0; | ||
2062 | |||
2063 | if (count == 0) { | ||
2064 | can_start = 1; | ||
2065 | NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_INITALIZING); | ||
2066 | } | ||
2067 | |||
2068 | NXWR32(adapter, NX_CRB_DEV_REF_COUNT, ++count); | ||
2069 | |||
2070 | netxen_api_unlock(adapter); | ||
2071 | |||
2072 | return can_start; | ||
2073 | } | ||
2074 | |||
2075 | static void | ||
2076 | netxen_schedule_work(struct netxen_adapter *adapter, | ||
2077 | work_func_t func, int delay) | ||
2078 | { | ||
2079 | INIT_DELAYED_WORK(&adapter->fw_work, func); | ||
2080 | schedule_delayed_work(&adapter->fw_work, delay); | ||
2081 | } | ||
2082 | |||
2083 | static void | ||
2084 | netxen_cancel_fw_work(struct netxen_adapter *adapter) | ||
2085 | { | ||
2086 | while (test_and_set_bit(__NX_RESETTING, &adapter->state)) | ||
2087 | msleep(10); | ||
2088 | |||
2089 | cancel_delayed_work_sync(&adapter->fw_work); | ||
2090 | } | ||
2091 | |||
2092 | static void | ||
2093 | netxen_attach_work(struct work_struct *work) | ||
2094 | { | ||
2095 | struct netxen_adapter *adapter = container_of(work, | ||
2096 | struct netxen_adapter, fw_work.work); | ||
2097 | struct net_device *netdev = adapter->netdev; | ||
2098 | int err = 0; | ||
2099 | |||
2100 | if (netif_running(netdev)) { | ||
2101 | err = netxen_nic_attach(adapter); | ||
2102 | if (err) | ||
2103 | goto done; | ||
2104 | |||
2105 | err = netxen_nic_up(adapter, netdev); | ||
2106 | if (err) { | ||
2107 | netxen_nic_detach(adapter); | ||
2108 | goto done; | ||
2109 | } | ||
2110 | |||
2111 | netxen_config_indev_addr(netdev, NETDEV_UP); | ||
2112 | } | ||
2113 | |||
2114 | netif_device_attach(netdev); | ||
2115 | |||
2116 | done: | ||
2117 | adapter->fw_fail_cnt = 0; | ||
2118 | clear_bit(__NX_RESETTING, &adapter->state); | ||
2119 | netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY); | ||
2120 | } | ||
2121 | |||
2122 | static void | ||
2123 | netxen_fwinit_work(struct work_struct *work) | ||
2124 | { | ||
2125 | struct netxen_adapter *adapter = container_of(work, | ||
2126 | struct netxen_adapter, fw_work.work); | ||
2127 | int dev_state; | ||
2128 | |||
2129 | dev_state = NXRD32(adapter, NX_CRB_DEV_STATE); | ||
2130 | |||
2131 | switch (dev_state) { | ||
2132 | case NX_DEV_COLD: | ||
2133 | case NX_DEV_READY: | ||
2134 | netxen_start_firmware(adapter); | ||
2135 | netxen_schedule_work(adapter, netxen_attach_work, 0); | ||
2136 | return; | ||
2137 | |||
2138 | case NX_DEV_INITALIZING: | ||
2139 | if (++adapter->fw_wait_cnt < FW_POLL_THRESH) { | ||
2140 | netxen_schedule_work(adapter, | ||
2141 | netxen_fwinit_work, 2 * FW_POLL_DELAY); | ||
2142 | return; | ||
2143 | } | ||
2144 | break; | ||
2145 | |||
2146 | case NX_DEV_FAILED: | ||
2147 | default: | ||
2148 | break; | ||
2149 | } | ||
2150 | |||
2151 | nx_incr_dev_ref_cnt(adapter); | ||
2152 | clear_bit(__NX_RESETTING, &adapter->state); | ||
2153 | } | ||
2154 | |||
2155 | static void | ||
2156 | netxen_detach_work(struct work_struct *work) | ||
2157 | { | ||
2158 | struct netxen_adapter *adapter = container_of(work, | ||
2159 | struct netxen_adapter, fw_work.work); | ||
2160 | struct net_device *netdev = adapter->netdev; | ||
2161 | int ref_cnt, delay; | ||
2162 | u32 status; | ||
2163 | |||
2164 | netif_device_detach(netdev); | ||
2165 | |||
2166 | if (netif_running(netdev)) | ||
2167 | netxen_nic_down(adapter, netdev); | ||
2168 | |||
2169 | netxen_nic_detach(adapter); | ||
2170 | |||
2171 | status = NXRD32(adapter, NETXEN_PEG_HALT_STATUS1); | ||
2172 | |||
2173 | ref_cnt = nx_decr_dev_ref_cnt(adapter); | ||
2174 | |||
2175 | if (status & NX_RCODE_FATAL_ERROR) | ||
2176 | return; | ||
2177 | |||
2178 | if (adapter->temp == NX_TEMP_PANIC) | ||
2179 | return; | ||
2180 | |||
2181 | delay = (ref_cnt == 0) ? 0 : (2 * FW_POLL_DELAY); | ||
2182 | |||
2183 | adapter->fw_wait_cnt = 0; | ||
2184 | netxen_schedule_work(adapter, netxen_fwinit_work, delay); | ||
2185 | } | ||
2186 | |||
2187 | static int | ||
2188 | netxen_check_health(struct netxen_adapter *adapter) | ||
2189 | { | ||
2190 | u32 state, heartbit; | ||
2191 | struct net_device *netdev = adapter->netdev; | ||
2192 | |||
2193 | if (netxen_nic_check_temp(adapter)) | ||
2194 | goto detach; | ||
2195 | |||
2196 | state = NXRD32(adapter, NX_CRB_DEV_STATE); | ||
2197 | if (state == NX_DEV_NEED_RESET) | ||
2198 | goto detach; | ||
2199 | |||
2200 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) | ||
2201 | return 0; | ||
2202 | |||
2203 | heartbit = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER); | ||
2204 | if (heartbit != adapter->heartbit) { | ||
2205 | adapter->heartbit = heartbit; | ||
2206 | adapter->fw_fail_cnt = 0; | ||
2207 | return 0; | ||
2208 | } | ||
2209 | |||
2210 | if (++adapter->fw_fail_cnt < FW_FAIL_THRESH) | ||
2211 | return 0; | ||
2212 | |||
2213 | clear_bit(__NX_FW_ATTACHED, &adapter->state); | ||
2214 | |||
2215 | dev_info(&netdev->dev, "firmware hang detected\n"); | ||
2216 | |||
2217 | detach: | ||
2218 | if (!test_and_set_bit(__NX_RESETTING, &adapter->state)) | ||
2219 | netxen_schedule_work(adapter, netxen_detach_work, 0); | ||
2220 | return 1; | ||
2221 | } | ||
2222 | |||
2223 | static void | ||
2224 | netxen_fw_poll_work(struct work_struct *work) | ||
2225 | { | ||
2226 | struct netxen_adapter *adapter = container_of(work, | ||
2227 | struct netxen_adapter, fw_work.work); | ||
2228 | |||
2229 | if (test_bit(__NX_RESETTING, &adapter->state)) | ||
2230 | goto reschedule; | ||
2231 | |||
2232 | if (test_bit(__NX_DEV_UP, &adapter->state)) { | ||
2233 | if (!adapter->has_link_events) { | ||
2234 | |||
2235 | netxen_nic_handle_phy_intr(adapter); | ||
2236 | |||
2237 | if (adapter->link_changed) | ||
2238 | netxen_nic_set_link_parameters(adapter); | ||
2239 | } | ||
2240 | } | ||
2241 | |||
2242 | if (netxen_check_health(adapter)) | ||
2243 | return; | ||
2244 | |||
2245 | reschedule: | ||
2246 | netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY); | ||
2247 | } | ||
2248 | |||
1965 | static ssize_t | 2249 | static ssize_t |
1966 | netxen_store_bridged_mode(struct device *dev, | 2250 | netxen_store_bridged_mode(struct device *dev, |
1967 | struct device_attribute *attr, const char *buf, size_t len) | 2251 | struct device_attribute *attr, const char *buf, size_t len) |
@@ -2050,12 +2334,43 @@ netxen_destip_supported(struct netxen_adapter *adapter) | |||
2050 | return 1; | 2334 | return 1; |
2051 | } | 2335 | } |
2052 | 2336 | ||
2337 | static void | ||
2338 | netxen_config_indev_addr(struct net_device *dev, unsigned long event) | ||
2339 | { | ||
2340 | struct in_device *indev; | ||
2341 | struct netxen_adapter *adapter = netdev_priv(dev); | ||
2342 | |||
2343 | if (netxen_destip_supported(adapter)) | ||
2344 | return; | ||
2345 | |||
2346 | indev = in_dev_get(dev); | ||
2347 | if (!indev) | ||
2348 | return; | ||
2349 | |||
2350 | for_ifa(indev) { | ||
2351 | switch (event) { | ||
2352 | case NETDEV_UP: | ||
2353 | netxen_config_ipaddr(adapter, | ||
2354 | ifa->ifa_address, NX_IP_UP); | ||
2355 | break; | ||
2356 | case NETDEV_DOWN: | ||
2357 | netxen_config_ipaddr(adapter, | ||
2358 | ifa->ifa_address, NX_IP_DOWN); | ||
2359 | break; | ||
2360 | default: | ||
2361 | break; | ||
2362 | } | ||
2363 | } endfor_ifa(indev); | ||
2364 | |||
2365 | in_dev_put(indev); | ||
2366 | return; | ||
2367 | } | ||
2368 | |||
2053 | static int netxen_netdev_event(struct notifier_block *this, | 2369 | static int netxen_netdev_event(struct notifier_block *this, |
2054 | unsigned long event, void *ptr) | 2370 | unsigned long event, void *ptr) |
2055 | { | 2371 | { |
2056 | struct netxen_adapter *adapter; | 2372 | struct netxen_adapter *adapter; |
2057 | struct net_device *dev = (struct net_device *)ptr; | 2373 | struct net_device *dev = (struct net_device *)ptr; |
2058 | struct in_device *indev; | ||
2059 | 2374 | ||
2060 | recheck: | 2375 | recheck: |
2061 | if (dev == NULL) | 2376 | if (dev == NULL) |
@@ -2071,32 +2386,13 @@ recheck: | |||
2071 | 2386 | ||
2072 | adapter = netdev_priv(dev); | 2387 | adapter = netdev_priv(dev); |
2073 | 2388 | ||
2074 | if (!adapter || !netxen_destip_supported(adapter)) | 2389 | if (!adapter) |
2075 | goto done; | 2390 | goto done; |
2076 | 2391 | ||
2077 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) | 2392 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) |
2078 | goto done; | 2393 | goto done; |
2079 | 2394 | ||
2080 | indev = in_dev_get(dev); | 2395 | netxen_config_indev_addr(dev, event); |
2081 | if (!indev) | ||
2082 | goto done; | ||
2083 | |||
2084 | for_ifa(indev) { | ||
2085 | switch (event) { | ||
2086 | case NETDEV_UP: | ||
2087 | netxen_config_ipaddr(adapter, | ||
2088 | ifa->ifa_address, NX_IP_UP); | ||
2089 | break; | ||
2090 | case NETDEV_DOWN: | ||
2091 | netxen_config_ipaddr(adapter, | ||
2092 | ifa->ifa_address, NX_IP_DOWN); | ||
2093 | break; | ||
2094 | default: | ||
2095 | break; | ||
2096 | } | ||
2097 | } endfor_ifa(indev); | ||
2098 | |||
2099 | in_dev_put(indev); | ||
2100 | done: | 2396 | done: |
2101 | return NOTIFY_DONE; | 2397 | return NOTIFY_DONE; |
2102 | } | 2398 | } |
diff --git a/drivers/net/niu.c b/drivers/net/niu.c index 119fd4e04141..76cc2614f480 100644 --- a/drivers/net/niu.c +++ b/drivers/net/niu.c | |||
@@ -10145,11 +10145,6 @@ static const struct niu_ops niu_phys_ops = { | |||
10145 | .unmap_single = niu_phys_unmap_single, | 10145 | .unmap_single = niu_phys_unmap_single, |
10146 | }; | 10146 | }; |
10147 | 10147 | ||
10148 | static unsigned long res_size(struct resource *r) | ||
10149 | { | ||
10150 | return r->end - r->start + 1UL; | ||
10151 | } | ||
10152 | |||
10153 | static int __devinit niu_of_probe(struct of_device *op, | 10148 | static int __devinit niu_of_probe(struct of_device *op, |
10154 | const struct of_device_id *match) | 10149 | const struct of_device_id *match) |
10155 | { | 10150 | { |
@@ -10189,7 +10184,7 @@ static int __devinit niu_of_probe(struct of_device *op, | |||
10189 | dev->features |= (NETIF_F_SG | NETIF_F_HW_CSUM); | 10184 | dev->features |= (NETIF_F_SG | NETIF_F_HW_CSUM); |
10190 | 10185 | ||
10191 | np->regs = of_ioremap(&op->resource[1], 0, | 10186 | np->regs = of_ioremap(&op->resource[1], 0, |
10192 | res_size(&op->resource[1]), | 10187 | resource_size(&op->resource[1]), |
10193 | "niu regs"); | 10188 | "niu regs"); |
10194 | if (!np->regs) { | 10189 | if (!np->regs) { |
10195 | dev_err(&op->dev, PFX "Cannot map device registers, " | 10190 | dev_err(&op->dev, PFX "Cannot map device registers, " |
@@ -10199,7 +10194,7 @@ static int __devinit niu_of_probe(struct of_device *op, | |||
10199 | } | 10194 | } |
10200 | 10195 | ||
10201 | np->vir_regs_1 = of_ioremap(&op->resource[2], 0, | 10196 | np->vir_regs_1 = of_ioremap(&op->resource[2], 0, |
10202 | res_size(&op->resource[2]), | 10197 | resource_size(&op->resource[2]), |
10203 | "niu vregs-1"); | 10198 | "niu vregs-1"); |
10204 | if (!np->vir_regs_1) { | 10199 | if (!np->vir_regs_1) { |
10205 | dev_err(&op->dev, PFX "Cannot map device vir registers 1, " | 10200 | dev_err(&op->dev, PFX "Cannot map device vir registers 1, " |
@@ -10209,7 +10204,7 @@ static int __devinit niu_of_probe(struct of_device *op, | |||
10209 | } | 10204 | } |
10210 | 10205 | ||
10211 | np->vir_regs_2 = of_ioremap(&op->resource[3], 0, | 10206 | np->vir_regs_2 = of_ioremap(&op->resource[3], 0, |
10212 | res_size(&op->resource[3]), | 10207 | resource_size(&op->resource[3]), |
10213 | "niu vregs-2"); | 10208 | "niu vregs-2"); |
10214 | if (!np->vir_regs_2) { | 10209 | if (!np->vir_regs_2) { |
10215 | dev_err(&op->dev, PFX "Cannot map device vir registers 2, " | 10210 | dev_err(&op->dev, PFX "Cannot map device vir registers 2, " |
@@ -10244,19 +10239,19 @@ static int __devinit niu_of_probe(struct of_device *op, | |||
10244 | err_out_iounmap: | 10239 | err_out_iounmap: |
10245 | if (np->vir_regs_1) { | 10240 | if (np->vir_regs_1) { |
10246 | of_iounmap(&op->resource[2], np->vir_regs_1, | 10241 | of_iounmap(&op->resource[2], np->vir_regs_1, |
10247 | res_size(&op->resource[2])); | 10242 | resource_size(&op->resource[2])); |
10248 | np->vir_regs_1 = NULL; | 10243 | np->vir_regs_1 = NULL; |
10249 | } | 10244 | } |
10250 | 10245 | ||
10251 | if (np->vir_regs_2) { | 10246 | if (np->vir_regs_2) { |
10252 | of_iounmap(&op->resource[3], np->vir_regs_2, | 10247 | of_iounmap(&op->resource[3], np->vir_regs_2, |
10253 | res_size(&op->resource[3])); | 10248 | resource_size(&op->resource[3])); |
10254 | np->vir_regs_2 = NULL; | 10249 | np->vir_regs_2 = NULL; |
10255 | } | 10250 | } |
10256 | 10251 | ||
10257 | if (np->regs) { | 10252 | if (np->regs) { |
10258 | of_iounmap(&op->resource[1], np->regs, | 10253 | of_iounmap(&op->resource[1], np->regs, |
10259 | res_size(&op->resource[1])); | 10254 | resource_size(&op->resource[1])); |
10260 | np->regs = NULL; | 10255 | np->regs = NULL; |
10261 | } | 10256 | } |
10262 | 10257 | ||
@@ -10281,19 +10276,19 @@ static int __devexit niu_of_remove(struct of_device *op) | |||
10281 | 10276 | ||
10282 | if (np->vir_regs_1) { | 10277 | if (np->vir_regs_1) { |
10283 | of_iounmap(&op->resource[2], np->vir_regs_1, | 10278 | of_iounmap(&op->resource[2], np->vir_regs_1, |
10284 | res_size(&op->resource[2])); | 10279 | resource_size(&op->resource[2])); |
10285 | np->vir_regs_1 = NULL; | 10280 | np->vir_regs_1 = NULL; |
10286 | } | 10281 | } |
10287 | 10282 | ||
10288 | if (np->vir_regs_2) { | 10283 | if (np->vir_regs_2) { |
10289 | of_iounmap(&op->resource[3], np->vir_regs_2, | 10284 | of_iounmap(&op->resource[3], np->vir_regs_2, |
10290 | res_size(&op->resource[3])); | 10285 | resource_size(&op->resource[3])); |
10291 | np->vir_regs_2 = NULL; | 10286 | np->vir_regs_2 = NULL; |
10292 | } | 10287 | } |
10293 | 10288 | ||
10294 | if (np->regs) { | 10289 | if (np->regs) { |
10295 | of_iounmap(&op->resource[1], np->regs, | 10290 | of_iounmap(&op->resource[1], np->regs, |
10296 | res_size(&op->resource[1])); | 10291 | resource_size(&op->resource[1])); |
10297 | np->regs = NULL; | 10292 | np->regs = NULL; |
10298 | } | 10293 | } |
10299 | 10294 | ||
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index a91e9b3a3eb6..50c6a3cfe439 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -3416,7 +3416,6 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, | |||
3416 | netif_wake_queue(dev); | 3416 | netif_wake_queue(dev); |
3417 | } | 3417 | } |
3418 | 3418 | ||
3419 | out: | ||
3420 | return NETDEV_TX_OK; | 3419 | return NETDEV_TX_OK; |
3421 | 3420 | ||
3422 | err_stop: | 3421 | err_stop: |
diff --git a/drivers/net/wan/dlci.c b/drivers/net/wan/dlci.c index 69d269d32b5b..15d353f268b5 100644 --- a/drivers/net/wan/dlci.c +++ b/drivers/net/wan/dlci.c | |||
@@ -186,46 +186,13 @@ static void dlci_receive(struct sk_buff *skb, struct net_device *dev) | |||
186 | dev_kfree_skb(skb); | 186 | dev_kfree_skb(skb); |
187 | } | 187 | } |
188 | 188 | ||
189 | static netdev_tx_t dlci_transmit(struct sk_buff *skb, | 189 | static netdev_tx_t dlci_transmit(struct sk_buff *skb, struct net_device *dev) |
190 | struct net_device *dev) | ||
191 | { | 190 | { |
192 | struct dlci_local *dlp; | 191 | struct dlci_local *dlp = netdev_priv(dev); |
193 | netdev_tx_t ret; | ||
194 | |||
195 | if (!skb || !dev) | ||
196 | return NETDEV_TX_OK; | ||
197 | |||
198 | dlp = netdev_priv(dev); | ||
199 | |||
200 | netif_stop_queue(dev); | ||
201 | |||
202 | /* This is hackish, overloads driver specific return values | ||
203 | on top of normal transmit return! */ | ||
204 | ret = dlp->slave->netdev_ops->ndo_start_xmit(skb, dlp->slave); | ||
205 | switch (ret) | ||
206 | { | ||
207 | case DLCI_RET_OK: | ||
208 | dev->stats.tx_packets++; | ||
209 | ret = NETDEV_TX_OK; | ||
210 | break; | ||
211 | case DLCI_RET_ERR: | ||
212 | dev->stats.tx_errors++; | ||
213 | ret = NETDEV_TX_OK; | ||
214 | break; | ||
215 | case DLCI_RET_DROP: | ||
216 | dev->stats.tx_dropped++; | ||
217 | ret = NETDEV_TX_BUSY; | ||
218 | break; | ||
219 | } | ||
220 | /* Alan Cox recommends always returning 0, and always freeing the packet */ | ||
221 | /* experience suggest a slightly more conservative approach */ | ||
222 | 192 | ||
223 | if (ret == NETDEV_TX_OK) | 193 | if (skb) |
224 | { | 194 | dlp->slave->netdev_ops->ndo_start_xmit(skb, dlp->slave); |
225 | dev_kfree_skb(skb); | 195 | return NETDEV_TX_OK; |
226 | netif_wake_queue(dev); | ||
227 | } | ||
228 | return(ret); | ||
229 | } | 196 | } |
230 | 197 | ||
231 | static int dlci_config(struct net_device *dev, struct dlci_conf __user *conf, int get) | 198 | static int dlci_config(struct net_device *dev, struct dlci_conf __user *conf, int get) |
diff --git a/drivers/net/wan/ixp4xx_hss.c b/drivers/net/wan/ixp4xx_hss.c index bb719b6114cb..c705046d8615 100644 --- a/drivers/net/wan/ixp4xx_hss.c +++ b/drivers/net/wan/ixp4xx_hss.c | |||
@@ -166,6 +166,29 @@ | |||
166 | #define CLK46X_SPEED_4096KHZ (( 16 << 22) | (280 << 12) | 1023) | 166 | #define CLK46X_SPEED_4096KHZ (( 16 << 22) | (280 << 12) | 1023) |
167 | #define CLK46X_SPEED_8192KHZ (( 8 << 22) | (280 << 12) | 2047) | 167 | #define CLK46X_SPEED_8192KHZ (( 8 << 22) | (280 << 12) | 2047) |
168 | 168 | ||
169 | /* | ||
170 | * HSS_CONFIG_CLOCK_CR register consists of 3 parts: | ||
171 | * A (10 bits), B (10 bits) and C (12 bits). | ||
172 | * IXP42x HSS clock generator operation (verified with an oscilloscope): | ||
173 | * Each clock bit takes 7.5 ns (1 / 133.xx MHz). | ||
174 | * The clock sequence consists of (C - B) states of 0s and 1s, each state is | ||
175 | * A bits wide. It's followed by (B + 1) states of 0s and 1s, each state is | ||
176 | * (A + 1) bits wide. | ||
177 | * | ||
178 | * The resulting average clock frequency (assuming 33.333 MHz oscillator) is: | ||
179 | * freq = 66.666 MHz / (A + (B + 1) / (C + 1)) | ||
180 | * minumum freq = 66.666 MHz / (A + 1) | ||
181 | * maximum freq = 66.666 MHz / A | ||
182 | * | ||
183 | * Example: A = 2, B = 2, C = 7, CLOCK_CR register = 2 << 22 | 2 << 12 | 7 | ||
184 | * freq = 66.666 MHz / (2 + (2 + 1) / (7 + 1)) = 28.07 MHz (Mb/s). | ||
185 | * The clock sequence is: 1100110011 (5 doubles) 000111000 (3 triples). | ||
186 | * The sequence takes (C - B) * A + (B + 1) * (A + 1) = 5 * 2 + 3 * 3 bits | ||
187 | * = 19 bits (each 7.5 ns long) = 142.5 ns (then the sequence repeats). | ||
188 | * The sequence consists of 4 complete clock periods, thus the average | ||
189 | * frequency (= clock rate) is 4 / 142.5 ns = 28.07 MHz (Mb/s). | ||
190 | * (max specified clock rate for IXP42x HSS is 8.192 Mb/s). | ||
191 | */ | ||
169 | 192 | ||
170 | /* hss_config, LUT entries */ | 193 | /* hss_config, LUT entries */ |
171 | #define TDMMAP_UNASSIGNED 0 | 194 | #define TDMMAP_UNASSIGNED 0 |
@@ -239,6 +262,7 @@ struct port { | |||
239 | unsigned int clock_type, clock_rate, loopback; | 262 | unsigned int clock_type, clock_rate, loopback; |
240 | unsigned int initialized, carrier; | 263 | unsigned int initialized, carrier; |
241 | u8 hdlc_cfg; | 264 | u8 hdlc_cfg; |
265 | u32 clock_reg; | ||
242 | }; | 266 | }; |
243 | 267 | ||
244 | /* NPE message structure */ | 268 | /* NPE message structure */ |
@@ -393,7 +417,7 @@ static void hss_config(struct port *port) | |||
393 | msg.cmd = PORT_CONFIG_WRITE; | 417 | msg.cmd = PORT_CONFIG_WRITE; |
394 | msg.hss_port = port->id; | 418 | msg.hss_port = port->id; |
395 | msg.index = HSS_CONFIG_CLOCK_CR; | 419 | msg.index = HSS_CONFIG_CLOCK_CR; |
396 | msg.data32 = CLK42X_SPEED_2048KHZ /* FIXME */; | 420 | msg.data32 = port->clock_reg; |
397 | hss_npe_send(port, &msg, "HSS_SET_CLOCK_CR"); | 421 | hss_npe_send(port, &msg, "HSS_SET_CLOCK_CR"); |
398 | 422 | ||
399 | memset(&msg, 0, sizeof(msg)); | 423 | memset(&msg, 0, sizeof(msg)); |
@@ -1160,6 +1184,62 @@ static int hss_hdlc_attach(struct net_device *dev, unsigned short encoding, | |||
1160 | } | 1184 | } |
1161 | } | 1185 | } |
1162 | 1186 | ||
1187 | static u32 check_clock(u32 rate, u32 a, u32 b, u32 c, | ||
1188 | u32 *best, u32 *best_diff, u32 *reg) | ||
1189 | { | ||
1190 | /* a is 10-bit, b is 10-bit, c is 12-bit */ | ||
1191 | u64 new_rate; | ||
1192 | u32 new_diff; | ||
1193 | |||
1194 | new_rate = ixp4xx_timer_freq * (u64)(c + 1); | ||
1195 | do_div(new_rate, a * (c + 1) + b + 1); | ||
1196 | new_diff = abs((u32)new_rate - rate); | ||
1197 | |||
1198 | if (new_diff < *best_diff) { | ||
1199 | *best = new_rate; | ||
1200 | *best_diff = new_diff; | ||
1201 | *reg = (a << 22) | (b << 12) | c; | ||
1202 | } | ||
1203 | return new_diff; | ||
1204 | } | ||
1205 | |||
1206 | static void find_best_clock(u32 rate, u32 *best, u32 *reg) | ||
1207 | { | ||
1208 | u32 a, b, diff = 0xFFFFFFFF; | ||
1209 | |||
1210 | a = ixp4xx_timer_freq / rate; | ||
1211 | |||
1212 | if (a > 0x3FF) { /* 10-bit value - we can go as slow as ca. 65 kb/s */ | ||
1213 | check_clock(rate, 0x3FF, 1, 1, best, &diff, reg); | ||
1214 | return; | ||
1215 | } | ||
1216 | if (a == 0) { /* > 66.666 MHz */ | ||
1217 | a = 1; /* minimum divider is 1 (a = 0, b = 1, c = 1) */ | ||
1218 | rate = ixp4xx_timer_freq; | ||
1219 | } | ||
1220 | |||
1221 | if (rate * a == ixp4xx_timer_freq) { /* don't divide by 0 later */ | ||
1222 | check_clock(rate, a - 1, 1, 1, best, &diff, reg); | ||
1223 | return; | ||
1224 | } | ||
1225 | |||
1226 | for (b = 0; b < 0x400; b++) { | ||
1227 | u64 c = (b + 1) * (u64)rate; | ||
1228 | do_div(c, ixp4xx_timer_freq - rate * a); | ||
1229 | c--; | ||
1230 | if (c >= 0xFFF) { /* 12-bit - no need to check more 'b's */ | ||
1231 | if (b == 0 && /* also try a bit higher rate */ | ||
1232 | !check_clock(rate, a - 1, 1, 1, best, &diff, reg)) | ||
1233 | return; | ||
1234 | check_clock(rate, a, b, 0xFFF, best, &diff, reg); | ||
1235 | return; | ||
1236 | } | ||
1237 | if (!check_clock(rate, a, b, c, best, &diff, reg)) | ||
1238 | return; | ||
1239 | if (!check_clock(rate, a, b, c + 1, best, &diff, reg)) | ||
1240 | return; | ||
1241 | } | ||
1242 | } | ||
1163 | 1243 | ||
1164 | static int hss_hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | 1244 | static int hss_hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) |
1165 | { | 1245 | { |
@@ -1182,7 +1262,7 @@ static int hss_hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
1182 | } | 1262 | } |
1183 | memset(&new_line, 0, sizeof(new_line)); | 1263 | memset(&new_line, 0, sizeof(new_line)); |
1184 | new_line.clock_type = port->clock_type; | 1264 | new_line.clock_type = port->clock_type; |
1185 | new_line.clock_rate = 2048000; /* FIXME */ | 1265 | new_line.clock_rate = port->clock_rate; |
1186 | new_line.loopback = port->loopback; | 1266 | new_line.loopback = port->loopback; |
1187 | if (copy_to_user(line, &new_line, size)) | 1267 | if (copy_to_user(line, &new_line, size)) |
1188 | return -EFAULT; | 1268 | return -EFAULT; |
@@ -1206,7 +1286,13 @@ static int hss_hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
1206 | return -EINVAL; | 1286 | return -EINVAL; |
1207 | 1287 | ||
1208 | port->clock_type = clk; /* Update settings */ | 1288 | port->clock_type = clk; /* Update settings */ |
1209 | /* FIXME port->clock_rate = new_line.clock_rate */; | 1289 | if (clk == CLOCK_INT) |
1290 | find_best_clock(new_line.clock_rate, &port->clock_rate, | ||
1291 | &port->clock_reg); | ||
1292 | else { | ||
1293 | port->clock_rate = 0; | ||
1294 | port->clock_reg = CLK42X_SPEED_2048KHZ; | ||
1295 | } | ||
1210 | port->loopback = new_line.loopback; | 1296 | port->loopback = new_line.loopback; |
1211 | 1297 | ||
1212 | spin_lock_irqsave(&npe_lock, flags); | 1298 | spin_lock_irqsave(&npe_lock, flags); |
@@ -1266,7 +1352,8 @@ static int __devinit hss_init_one(struct platform_device *pdev) | |||
1266 | dev->netdev_ops = &hss_hdlc_ops; | 1352 | dev->netdev_ops = &hss_hdlc_ops; |
1267 | dev->tx_queue_len = 100; | 1353 | dev->tx_queue_len = 100; |
1268 | port->clock_type = CLOCK_EXT; | 1354 | port->clock_type = CLOCK_EXT; |
1269 | port->clock_rate = 2048000; | 1355 | port->clock_rate = 0; |
1356 | port->clock_reg = CLK42X_SPEED_2048KHZ; | ||
1270 | port->id = pdev->id; | 1357 | port->id = pdev->id; |
1271 | port->dev = &pdev->dev; | 1358 | port->dev = &pdev->dev; |
1272 | port->plat = pdev->dev.platform_data; | 1359 | port->plat = pdev->dev.platform_data; |
diff --git a/drivers/net/wan/pci200syn.c b/drivers/net/wan/pci200syn.c index e035d8c57e11..a52f29c72c33 100644 --- a/drivers/net/wan/pci200syn.c +++ b/drivers/net/wan/pci200syn.c | |||
@@ -360,15 +360,6 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev, | |||
360 | " %u RX packets rings\n", ramsize / 1024, ramphys, | 360 | " %u RX packets rings\n", ramsize / 1024, ramphys, |
361 | pdev->irq, card->tx_ring_buffers, card->rx_ring_buffers); | 361 | pdev->irq, card->tx_ring_buffers, card->rx_ring_buffers); |
362 | 362 | ||
363 | if (pdev->subsystem_device == PCI_DEVICE_ID_PLX_9050) { | ||
364 | printk(KERN_ERR "Detected PCI200SYN card with old " | ||
365 | "configuration data.\n"); | ||
366 | printk(KERN_ERR "See <http://www.kernel.org/pub/" | ||
367 | "linux/utils/net/hdlc/pci200syn/> for update.\n"); | ||
368 | printk(KERN_ERR "The card will stop working with" | ||
369 | " future versions of Linux if not updated.\n"); | ||
370 | } | ||
371 | |||
372 | if (card->tx_ring_buffers < 1) { | 363 | if (card->tx_ring_buffers < 1) { |
373 | printk(KERN_ERR "pci200syn: RAM test failed\n"); | 364 | printk(KERN_ERR "pci200syn: RAM test failed\n"); |
374 | pci200_pci_remove_one(pdev); | 365 | pci200_pci_remove_one(pdev); |
@@ -427,8 +418,6 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev, | |||
427 | 418 | ||
428 | static struct pci_device_id pci200_pci_tbl[] __devinitdata = { | 419 | static struct pci_device_id pci200_pci_tbl[] __devinitdata = { |
429 | { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, PCI_VENDOR_ID_PLX, | 420 | { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, PCI_VENDOR_ID_PLX, |
430 | PCI_DEVICE_ID_PLX_9050, 0, 0, 0 }, | ||
431 | { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, PCI_VENDOR_ID_PLX, | ||
432 | PCI_DEVICE_ID_PLX_PCI200SYN, 0, 0, 0 }, | 421 | PCI_DEVICE_ID_PLX_PCI200SYN, 0, 0, 0 }, |
433 | { 0, } | 422 | { 0, } |
434 | }; | 423 | }; |
diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c index 63c76458431c..2b15a7e40d5b 100644 --- a/drivers/net/wan/sdla.c +++ b/drivers/net/wan/sdla.c | |||
@@ -652,7 +652,7 @@ static int sdla_dlci_conf(struct net_device *slave, struct net_device *master, i | |||
652 | 652 | ||
653 | /* NOTE: the DLCI driver deals with freeing the SKB!! */ | 653 | /* NOTE: the DLCI driver deals with freeing the SKB!! */ |
654 | static netdev_tx_t sdla_transmit(struct sk_buff *skb, | 654 | static netdev_tx_t sdla_transmit(struct sk_buff *skb, |
655 | struct net_device *dev) | 655 | struct net_device *dev) |
656 | { | 656 | { |
657 | struct frad_local *flp; | 657 | struct frad_local *flp; |
658 | int ret, addr, accept, i; | 658 | int ret, addr, accept, i; |
@@ -712,23 +712,21 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb, | |||
712 | } | 712 | } |
713 | break; | 713 | break; |
714 | } | 714 | } |
715 | |||
715 | switch (ret) | 716 | switch (ret) |
716 | { | 717 | { |
717 | case SDLA_RET_OK: | 718 | case SDLA_RET_OK: |
718 | dev->stats.tx_packets++; | 719 | dev->stats.tx_packets++; |
719 | ret = DLCI_RET_OK; | ||
720 | break; | 720 | break; |
721 | 721 | ||
722 | case SDLA_RET_CIR_OVERFLOW: | 722 | case SDLA_RET_CIR_OVERFLOW: |
723 | case SDLA_RET_BUF_OVERSIZE: | 723 | case SDLA_RET_BUF_OVERSIZE: |
724 | case SDLA_RET_NO_BUFS: | 724 | case SDLA_RET_NO_BUFS: |
725 | dev->stats.tx_dropped++; | 725 | dev->stats.tx_dropped++; |
726 | ret = DLCI_RET_DROP; | ||
727 | break; | 726 | break; |
728 | 727 | ||
729 | default: | 728 | default: |
730 | dev->stats.tx_errors++; | 729 | dev->stats.tx_errors++; |
731 | ret = DLCI_RET_ERR; | ||
732 | break; | 730 | break; |
733 | } | 731 | } |
734 | } | 732 | } |
@@ -738,6 +736,8 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb, | |||
738 | if(flp->master[i]!=NULL) | 736 | if(flp->master[i]!=NULL) |
739 | netif_wake_queue(flp->master[i]); | 737 | netif_wake_queue(flp->master[i]); |
740 | } | 738 | } |
739 | |||
740 | dev_kfree_skb(skb); | ||
741 | return NETDEV_TX_OK; | 741 | return NETDEV_TX_OK; |
742 | } | 742 | } |
743 | 743 | ||