@@ -78,6 +78,7 @@ enum board_idx {
78
78
BCM57402 ,
79
79
BCM57404 ,
80
80
BCM57406 ,
81
+ BCM57314 ,
81
82
BCM57304_VF ,
82
83
BCM57404_VF ,
83
84
};
@@ -92,6 +93,7 @@ static const struct {
92
93
{ "Broadcom BCM57402 NetXtreme-E Dual-port 10Gb Ethernet" },
93
94
{ "Broadcom BCM57404 NetXtreme-E Dual-port 10Gb/25Gb Ethernet" },
94
95
{ "Broadcom BCM57406 NetXtreme-E Dual-port 10GBase-T Ethernet" },
96
+ { "Broadcom BCM57314 NetXtreme-C Dual-port 10Gb/25Gb/40Gb/50Gb Ethernet" },
95
97
{ "Broadcom BCM57304 NetXtreme-C Ethernet Virtual Function" },
96
98
{ "Broadcom BCM57404 NetXtreme-E Ethernet Virtual Function" },
97
99
};
@@ -103,6 +105,7 @@ static const struct pci_device_id bnxt_pci_tbl[] = {
103
105
{ PCI_VDEVICE (BROADCOM , 0x16d0 ), .driver_data = BCM57402 },
104
106
{ PCI_VDEVICE (BROADCOM , 0x16d1 ), .driver_data = BCM57404 },
105
107
{ PCI_VDEVICE (BROADCOM , 0x16d2 ), .driver_data = BCM57406 },
108
+ { PCI_VDEVICE (BROADCOM , 0x16df ), .driver_data = BCM57314 },
106
109
#ifdef CONFIG_BNXT_SRIOV
107
110
{ PCI_VDEVICE (BROADCOM , 0x16cb ), .driver_data = BCM57304_VF },
108
111
{ PCI_VDEVICE (BROADCOM , 0x16d3 ), .driver_data = BCM57404_VF },
@@ -1324,15 +1327,6 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_napi *bnapi, u32 *raw_cons,
1324
1327
((data) & \
1325
1328
HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_PORT_ID_MASK)
1326
1329
1327
- #define BNXT_EVENT_POLICY_MASK \
1328
- HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_ENFORCEMENT_POLICY_MASK
1329
-
1330
- #define BNXT_EVENT_POLICY_SFT \
1331
- HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_ENFORCEMENT_POLICY_SFT
1332
-
1333
- #define BNXT_GET_EVENT_POLICY (data ) \
1334
- (((data) & BNXT_EVENT_POLICY_MASK) >> BNXT_EVENT_POLICY_SFT)
1335
-
1336
1330
static int bnxt_async_event_process (struct bnxt * bp ,
1337
1331
struct hwrm_async_event_cmpl * cmpl )
1338
1332
{
@@ -1371,9 +1365,6 @@ static int bnxt_async_event_process(struct bnxt *bp,
1371
1365
if (bp -> pf .port_id != port_id )
1372
1366
break ;
1373
1367
1374
- bp -> link_info .last_port_module_event =
1375
- BNXT_GET_EVENT_POLICY (data1 );
1376
-
1377
1368
set_bit (BNXT_HWRM_PORT_MODULE_SP_EVENT , & bp -> sp_event );
1378
1369
break ;
1379
1370
}
@@ -1503,7 +1494,7 @@ static int bnxt_poll_work(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
1503
1494
/* The valid test of the entry must be done first before
1504
1495
* reading any further.
1505
1496
*/
1506
- rmb ();
1497
+ dma_rmb ();
1507
1498
if (TX_CMP_TYPE (txcmp ) == CMP_TYPE_TX_L2_CMP ) {
1508
1499
tx_pkts ++ ;
1509
1500
/* return full budget so NAPI will complete. */
@@ -2780,7 +2771,7 @@ void bnxt_hwrm_cmd_hdr_init(struct bnxt *bp, void *request, u16 req_type,
2780
2771
static int bnxt_hwrm_do_send_msg (struct bnxt * bp , void * msg , u32 msg_len ,
2781
2772
int timeout , bool silent )
2782
2773
{
2783
- int i , intr_process , rc ;
2774
+ int i , intr_process , rc , tmo_count ;
2784
2775
struct input * req = msg ;
2785
2776
u32 * data = msg ;
2786
2777
__le32 * resp_len , * valid ;
@@ -2809,11 +2800,12 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len,
2809
2800
timeout = DFLT_HWRM_CMD_TIMEOUT ;
2810
2801
2811
2802
i = 0 ;
2803
+ tmo_count = timeout * 40 ;
2812
2804
if (intr_process ) {
2813
2805
/* Wait until hwrm response cmpl interrupt is processed */
2814
2806
while (bp -> hwrm_intr_seq_id != HWRM_SEQ_ID_INVALID &&
2815
- i ++ < timeout ) {
2816
- usleep_range (600 , 800 );
2807
+ i ++ < tmo_count ) {
2808
+ usleep_range (25 , 40 );
2817
2809
}
2818
2810
2819
2811
if (bp -> hwrm_intr_seq_id != HWRM_SEQ_ID_INVALID ) {
@@ -2824,30 +2816,30 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len,
2824
2816
} else {
2825
2817
/* Check if response len is updated */
2826
2818
resp_len = bp -> hwrm_cmd_resp_addr + HWRM_RESP_LEN_OFFSET ;
2827
- for (i = 0 ; i < timeout ; i ++ ) {
2819
+ for (i = 0 ; i < tmo_count ; i ++ ) {
2828
2820
len = (le32_to_cpu (* resp_len ) & HWRM_RESP_LEN_MASK ) >>
2829
2821
HWRM_RESP_LEN_SFT ;
2830
2822
if (len )
2831
2823
break ;
2832
- usleep_range (600 , 800 );
2824
+ usleep_range (25 , 40 );
2833
2825
}
2834
2826
2835
- if (i >= timeout ) {
2827
+ if (i >= tmo_count ) {
2836
2828
netdev_err (bp -> dev , "Error (timeout: %d) msg {0x%x 0x%x} len:%d\n" ,
2837
2829
timeout , le16_to_cpu (req -> req_type ),
2838
- le16_to_cpu (req -> seq_id ), * resp_len );
2830
+ le16_to_cpu (req -> seq_id ), len );
2839
2831
return -1 ;
2840
2832
}
2841
2833
2842
2834
/* Last word of resp contains valid bit */
2843
2835
valid = bp -> hwrm_cmd_resp_addr + len - 4 ;
2844
- for (i = 0 ; i < timeout ; i ++ ) {
2836
+ for (i = 0 ; i < 5 ; i ++ ) {
2845
2837
if (le32_to_cpu (* valid ) & HWRM_RESP_VALID_MASK )
2846
2838
break ;
2847
- usleep_range ( 600 , 800 );
2839
+ udelay ( 1 );
2848
2840
}
2849
2841
2850
- if (i >= timeout ) {
2842
+ if (i >= 5 ) {
2851
2843
netdev_err (bp -> dev , "Error (timeout: %d) msg {0x%x 0x%x} len:%d v:%d\n" ,
2852
2844
timeout , le16_to_cpu (req -> req_type ),
2853
2845
le16_to_cpu (req -> seq_id ), len , * valid );
@@ -4734,6 +4726,7 @@ static int bnxt_update_link(struct bnxt *bp, bool chng_link_state)
4734
4726
link_info -> transceiver = resp -> xcvr_pkg_type ;
4735
4727
link_info -> phy_addr = resp -> eee_config_phy_addr &
4736
4728
PORT_PHY_QCFG_RESP_PHY_ADDR_MASK ;
4729
+ link_info -> module_status = resp -> module_status ;
4737
4730
4738
4731
if (bp -> flags & BNXT_FLAG_EEE_CAP ) {
4739
4732
struct ethtool_eee * eee = & bp -> eee ;
@@ -4786,6 +4779,33 @@ static int bnxt_update_link(struct bnxt *bp, bool chng_link_state)
4786
4779
return 0 ;
4787
4780
}
4788
4781
4782
+ static void bnxt_get_port_module_status (struct bnxt * bp )
4783
+ {
4784
+ struct bnxt_link_info * link_info = & bp -> link_info ;
4785
+ struct hwrm_port_phy_qcfg_output * resp = & link_info -> phy_qcfg_resp ;
4786
+ u8 module_status ;
4787
+
4788
+ if (bnxt_update_link (bp , true))
4789
+ return ;
4790
+
4791
+ module_status = link_info -> module_status ;
4792
+ switch (module_status ) {
4793
+ case PORT_PHY_QCFG_RESP_MODULE_STATUS_DISABLETX :
4794
+ case PORT_PHY_QCFG_RESP_MODULE_STATUS_PWRDOWN :
4795
+ case PORT_PHY_QCFG_RESP_MODULE_STATUS_WARNINGMSG :
4796
+ netdev_warn (bp -> dev , "Unqualified SFP+ module detected on port %d\n" ,
4797
+ bp -> pf .port_id );
4798
+ if (bp -> hwrm_spec_code >= 0x10201 ) {
4799
+ netdev_warn (bp -> dev , "Module part number %s\n" ,
4800
+ resp -> phy_vendor_partnumber );
4801
+ }
4802
+ if (module_status == PORT_PHY_QCFG_RESP_MODULE_STATUS_DISABLETX )
4803
+ netdev_warn (bp -> dev , "TX is disabled\n" );
4804
+ if (module_status == PORT_PHY_QCFG_RESP_MODULE_STATUS_PWRDOWN )
4805
+ netdev_warn (bp -> dev , "SFP+ module is shutdown\n" );
4806
+ }
4807
+ }
4808
+
4789
4809
static void
4790
4810
bnxt_hwrm_set_pause_common (struct bnxt * bp , struct hwrm_port_phy_cfg_input * req )
4791
4811
{
@@ -5078,7 +5098,8 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
5078
5098
/* Enable TX queues */
5079
5099
bnxt_tx_enable (bp );
5080
5100
mod_timer (& bp -> timer , jiffies + bp -> current_interval );
5081
- bnxt_update_link (bp , true);
5101
+ /* Poll link status and check for SFP+ module status */
5102
+ bnxt_get_port_module_status (bp );
5082
5103
5083
5104
return 0 ;
5084
5105
@@ -5613,28 +5634,6 @@ static void bnxt_timer(unsigned long data)
5613
5634
mod_timer (& bp -> timer , jiffies + bp -> current_interval );
5614
5635
}
5615
5636
5616
- static void bnxt_port_module_event (struct bnxt * bp )
5617
- {
5618
- struct bnxt_link_info * link_info = & bp -> link_info ;
5619
- struct hwrm_port_phy_qcfg_output * resp = & link_info -> phy_qcfg_resp ;
5620
-
5621
- if (bnxt_update_link (bp , true))
5622
- return ;
5623
-
5624
- if (link_info -> last_port_module_event != 0 ) {
5625
- netdev_warn (bp -> dev , "Unqualified SFP+ module detected on port %d\n" ,
5626
- bp -> pf .port_id );
5627
- if (bp -> hwrm_spec_code >= 0x10201 ) {
5628
- netdev_warn (bp -> dev , "Module part number %s\n" ,
5629
- resp -> phy_vendor_partnumber );
5630
- }
5631
- }
5632
- if (link_info -> last_port_module_event == 1 )
5633
- netdev_warn (bp -> dev , "TX is disabled\n" );
5634
- if (link_info -> last_port_module_event == 3 )
5635
- netdev_warn (bp -> dev , "Shutdown SFP+ module\n" );
5636
- }
5637
-
5638
5637
static void bnxt_cfg_ntp_filters (struct bnxt * );
5639
5638
5640
5639
static void bnxt_sp_task (struct work_struct * work )
@@ -5683,7 +5682,7 @@ static void bnxt_sp_task(struct work_struct *work)
5683
5682
}
5684
5683
5685
5684
if (test_and_clear_bit (BNXT_HWRM_PORT_MODULE_SP_EVENT , & bp -> sp_event ))
5686
- bnxt_port_module_event (bp );
5685
+ bnxt_get_port_module_status (bp );
5687
5686
5688
5687
if (test_and_clear_bit (BNXT_PERIODIC_STATS_SP_EVENT , & bp -> sp_event ))
5689
5688
bnxt_hwrm_port_qstats (bp );
@@ -6260,6 +6259,22 @@ static int bnxt_set_dflt_rings(struct bnxt *bp)
6260
6259
return rc ;
6261
6260
}
6262
6261
6262
+ static void bnxt_parse_log_pcie_link (struct bnxt * bp )
6263
+ {
6264
+ enum pcie_link_width width = PCIE_LNK_WIDTH_UNKNOWN ;
6265
+ enum pci_bus_speed speed = PCI_SPEED_UNKNOWN ;
6266
+
6267
+ if (pcie_get_minimum_link (bp -> pdev , & speed , & width ) ||
6268
+ speed == PCI_SPEED_UNKNOWN || width == PCIE_LNK_WIDTH_UNKNOWN )
6269
+ netdev_info (bp -> dev , "Failed to determine PCIe Link Info\n" );
6270
+ else
6271
+ netdev_info (bp -> dev , "PCIe: Speed %s Width x%d\n" ,
6272
+ speed == PCIE_SPEED_2_5GT ? "2.5GT/s" :
6273
+ speed == PCIE_SPEED_5_0GT ? "5.0GT/s" :
6274
+ speed == PCIE_SPEED_8_0GT ? "8.0GT/s" :
6275
+ "Unknown" , width );
6276
+ }
6277
+
6263
6278
static int bnxt_init_one (struct pci_dev * pdev , const struct pci_device_id * ent )
6264
6279
{
6265
6280
static int version_printed ;
@@ -6380,6 +6395,8 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
6380
6395
board_info [ent -> driver_data ].name ,
6381
6396
(long )pci_resource_start (pdev , 0 ), dev -> dev_addr );
6382
6397
6398
+ bnxt_parse_log_pcie_link (bp );
6399
+
6383
6400
return 0 ;
6384
6401
6385
6402
init_err :
0 commit comments