aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-08-29 23:15:42 -0400
committerDavid S. Miller <davem@davemloft.net>2014-08-29 23:15:42 -0400
commit879ece6ecb2107ef1bbc3332cb2fea54c7d3a636 (patch)
treee47b74db9e3286139010d853affab0022c249c2a
parent10c51b56232d24f150e39884a9e749fd99cbc60c (diff)
parent07fbc6b79f63ae2a3e6afb88ec1b18abbf0430a0 (diff)
Merge branch 'qlcnic-next'
Shahed Shaikh says: ==================== qlcnic: Feature addition and enhancements This series contains following feature addition and enhancements, - Update Link speed and Port type information for 83xx series adapters - Support 0x8830 device ID - Support for Power on Self Test (POST) feature for 83xx - Use usleep_range() instead of msleep() for values less than 20ms ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--MAINTAINERS2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic.h8
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c218
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c156
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c6
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c10
8 files changed, 335 insertions, 69 deletions
diff --git a/MAINTAINERS b/MAINTAINERS
index f01f54f27750..c9b4b55bcbb3 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7361,7 +7361,7 @@ F: drivers/net/ethernet/qlogic/qla3xxx.*
7361 7361
7362QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER 7362QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
7363M: Shahed Shaikh <shahed.shaikh@qlogic.com> 7363M: Shahed Shaikh <shahed.shaikh@qlogic.com>
7364M: Dept-HSGLinuxNICDev@qlogic.com 7364M: Dept-GELinuxNICDev@qlogic.com
7365L: netdev@vger.kernel.org 7365L: netdev@vger.kernel.org
7366S: Supported 7366S: Supported
7367F: drivers/net/ethernet/qlogic/qlcnic/ 7367F: drivers/net/ethernet/qlogic/qlcnic/
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
index b84f5ea3d659..e56c1bb36141 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
@@ -39,8 +39,8 @@
39 39
40#define _QLCNIC_LINUX_MAJOR 5 40#define _QLCNIC_LINUX_MAJOR 5
41#define _QLCNIC_LINUX_MINOR 3 41#define _QLCNIC_LINUX_MINOR 3
42#define _QLCNIC_LINUX_SUBVERSION 61 42#define _QLCNIC_LINUX_SUBVERSION 62
43#define QLCNIC_LINUX_VERSIONID "5.3.61" 43#define QLCNIC_LINUX_VERSIONID "5.3.62"
44#define QLCNIC_DRV_IDC_VER 0x01 44#define QLCNIC_DRV_IDC_VER 0x01
45#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ 45#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\
46 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) 46 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
@@ -540,6 +540,8 @@ struct qlcnic_hardware_context {
540 u8 lb_mode; 540 u8 lb_mode;
541 u16 vxlan_port; 541 u16 vxlan_port;
542 struct device *hwmon_dev; 542 struct device *hwmon_dev;
543 u32 post_mode;
544 bool run_post;
543}; 545};
544 546
545struct qlcnic_adapter_stats { 547struct qlcnic_adapter_stats {
@@ -2283,6 +2285,7 @@ extern const struct ethtool_ops qlcnic_ethtool_failed_ops;
2283 2285
2284#define PCI_DEVICE_ID_QLOGIC_QLE824X 0x8020 2286#define PCI_DEVICE_ID_QLOGIC_QLE824X 0x8020
2285#define PCI_DEVICE_ID_QLOGIC_QLE834X 0x8030 2287#define PCI_DEVICE_ID_QLOGIC_QLE834X 0x8030
2288#define PCI_DEVICE_ID_QLOGIC_QLE8830 0x8830
2286#define PCI_DEVICE_ID_QLOGIC_VF_QLE834X 0x8430 2289#define PCI_DEVICE_ID_QLOGIC_VF_QLE834X 0x8430
2287#define PCI_DEVICE_ID_QLOGIC_QLE844X 0x8040 2290#define PCI_DEVICE_ID_QLOGIC_QLE844X 0x8040
2288#define PCI_DEVICE_ID_QLOGIC_VF_QLE844X 0x8440 2291#define PCI_DEVICE_ID_QLOGIC_VF_QLE844X 0x8440
@@ -2307,6 +2310,7 @@ static inline bool qlcnic_83xx_check(struct qlcnic_adapter *adapter)
2307 bool status; 2310 bool status;
2308 2311
2309 status = ((device == PCI_DEVICE_ID_QLOGIC_QLE834X) || 2312 status = ((device == PCI_DEVICE_ID_QLOGIC_QLE834X) ||
2313 (device == PCI_DEVICE_ID_QLOGIC_QLE8830) ||
2310 (device == PCI_DEVICE_ID_QLOGIC_QLE844X) || 2314 (device == PCI_DEVICE_ID_QLOGIC_QLE844X) ||
2311 (device == PCI_DEVICE_ID_QLOGIC_VF_QLE844X) || 2315 (device == PCI_DEVICE_ID_QLOGIC_VF_QLE844X) ||
2312 (device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X)) ? true : false; 2316 (device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X)) ? true : false;
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index 476e4998ef99..840bf36b5e9d 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -35,6 +35,35 @@ static void qlcnic_83xx_get_beacon_state(struct qlcnic_adapter *);
35#define QLC_SKIP_INACTIVE_PCI_REGS 7 35#define QLC_SKIP_INACTIVE_PCI_REGS 7
36#define QLC_MAX_LEGACY_FUNC_SUPP 8 36#define QLC_MAX_LEGACY_FUNC_SUPP 8
37 37
38/* 83xx Module type */
39#define QLC_83XX_MODULE_FIBRE_10GBASE_LRM 0x1 /* 10GBase-LRM */
40#define QLC_83XX_MODULE_FIBRE_10GBASE_LR 0x2 /* 10GBase-LR */
41#define QLC_83XX_MODULE_FIBRE_10GBASE_SR 0x3 /* 10GBase-SR */
42#define QLC_83XX_MODULE_DA_10GE_PASSIVE_CP 0x4 /* 10GE passive
43 * copper(compliant)
44 */
45#define QLC_83XX_MODULE_DA_10GE_ACTIVE_CP 0x5 /* 10GE active limiting
46 * copper(compliant)
47 */
48#define QLC_83XX_MODULE_DA_10GE_LEGACY_CP 0x6 /* 10GE passive copper
49 * (legacy, best effort)
50 */
51#define QLC_83XX_MODULE_FIBRE_1000BASE_SX 0x7 /* 1000Base-SX */
52#define QLC_83XX_MODULE_FIBRE_1000BASE_LX 0x8 /* 1000Base-LX */
53#define QLC_83XX_MODULE_FIBRE_1000BASE_CX 0x9 /* 1000Base-CX */
54#define QLC_83XX_MODULE_TP_1000BASE_T 0xa /* 1000Base-T*/
55#define QLC_83XX_MODULE_DA_1GE_PASSIVE_CP 0xb /* 1GE passive copper
56 * (legacy, best effort)
57 */
58#define QLC_83XX_MODULE_UNKNOWN 0xf /* Unknown module type */
59
60/* Port types */
61#define QLC_83XX_10_CAPABLE BIT_8
62#define QLC_83XX_100_CAPABLE BIT_9
63#define QLC_83XX_1G_CAPABLE BIT_10
64#define QLC_83XX_10G_CAPABLE BIT_11
65#define QLC_83XX_AUTONEG_ENABLE BIT_15
66
38static const struct qlcnic_mailbox_metadata qlcnic_83xx_mbx_tbl[] = { 67static const struct qlcnic_mailbox_metadata qlcnic_83xx_mbx_tbl[] = {
39 {QLCNIC_CMD_CONFIGURE_IP_ADDR, 6, 1}, 68 {QLCNIC_CMD_CONFIGURE_IP_ADDR, 6, 1},
40 {QLCNIC_CMD_CONFIG_INTRPT, 18, 34}, 69 {QLCNIC_CMD_CONFIG_INTRPT, 18, 34},
@@ -667,6 +696,7 @@ void qlcnic_83xx_write_crb(struct qlcnic_adapter *adapter, char *buf,
667 696
668int qlcnic_83xx_get_port_info(struct qlcnic_adapter *adapter) 697int qlcnic_83xx_get_port_info(struct qlcnic_adapter *adapter)
669{ 698{
699 struct qlcnic_hardware_context *ahw = adapter->ahw;
670 int status; 700 int status;
671 701
672 status = qlcnic_83xx_get_port_config(adapter); 702 status = qlcnic_83xx_get_port_config(adapter);
@@ -674,13 +704,20 @@ int qlcnic_83xx_get_port_info(struct qlcnic_adapter *adapter)
674 dev_err(&adapter->pdev->dev, 704 dev_err(&adapter->pdev->dev,
675 "Get Port Info failed\n"); 705 "Get Port Info failed\n");
676 } else { 706 } else {
677 if (QLC_83XX_SFP_10G_CAPABLE(adapter->ahw->port_config))
678 adapter->ahw->port_type = QLCNIC_XGBE;
679 else
680 adapter->ahw->port_type = QLCNIC_GBE;
681 707
682 if (QLC_83XX_AUTONEG(adapter->ahw->port_config)) 708 if (ahw->port_config & QLC_83XX_10G_CAPABLE) {
683 adapter->ahw->link_autoneg = AUTONEG_ENABLE; 709 ahw->port_type = QLCNIC_XGBE;
710 } else if (ahw->port_config & QLC_83XX_10_CAPABLE ||
711 ahw->port_config & QLC_83XX_100_CAPABLE ||
712 ahw->port_config & QLC_83XX_1G_CAPABLE) {
713 ahw->port_type = QLCNIC_GBE;
714 } else {
715 ahw->port_type = QLCNIC_XGBE;
716 }
717
718 if (QLC_83XX_AUTONEG(ahw->port_config))
719 ahw->link_autoneg = AUTONEG_ENABLE;
720
684 } 721 }
685 return status; 722 return status;
686} 723}
@@ -2664,7 +2701,7 @@ static int qlcnic_83xx_poll_flash_status_reg(struct qlcnic_adapter *adapter)
2664 QLC_83XX_FLASH_STATUS_READY) 2701 QLC_83XX_FLASH_STATUS_READY)
2665 break; 2702 break;
2666 2703
2667 msleep(QLC_83XX_FLASH_STATUS_REG_POLL_DELAY); 2704 usleep_range(1000, 1100);
2668 } while (--retries); 2705 } while (--retries);
2669 2706
2670 if (!retries) 2707 if (!retries)
@@ -3176,22 +3213,33 @@ int qlcnic_83xx_test_link(struct qlcnic_adapter *adapter)
3176 break; 3213 break;
3177 } 3214 }
3178 config = cmd.rsp.arg[3]; 3215 config = cmd.rsp.arg[3];
3179 if (QLC_83XX_SFP_PRESENT(config)) { 3216 switch (QLC_83XX_SFP_MODULE_TYPE(config)) {
3180 switch (ahw->module_type) { 3217 case QLC_83XX_MODULE_FIBRE_10GBASE_LRM:
3181 case LINKEVENT_MODULE_OPTICAL_UNKNOWN: 3218 case QLC_83XX_MODULE_FIBRE_10GBASE_LR:
3182 case LINKEVENT_MODULE_OPTICAL_SRLR: 3219 case QLC_83XX_MODULE_FIBRE_10GBASE_SR:
3183 case LINKEVENT_MODULE_OPTICAL_LRM: 3220 ahw->supported_type = PORT_FIBRE;
3184 case LINKEVENT_MODULE_OPTICAL_SFP_1G: 3221 ahw->port_type = QLCNIC_XGBE;
3185 ahw->supported_type = PORT_FIBRE; 3222 break;
3186 break; 3223 case QLC_83XX_MODULE_FIBRE_1000BASE_SX:
3187 case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLE: 3224 case QLC_83XX_MODULE_FIBRE_1000BASE_LX:
3188 case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLELEN: 3225 case QLC_83XX_MODULE_FIBRE_1000BASE_CX:
3189 case LINKEVENT_MODULE_TWINAX: 3226 ahw->supported_type = PORT_FIBRE;
3190 ahw->supported_type = PORT_TP; 3227 ahw->port_type = QLCNIC_GBE;
3191 break; 3228 break;
3192 default: 3229 case QLC_83XX_MODULE_TP_1000BASE_T:
3193 ahw->supported_type = PORT_OTHER; 3230 ahw->supported_type = PORT_TP;
3194 } 3231 ahw->port_type = QLCNIC_GBE;
3232 break;
3233 case QLC_83XX_MODULE_DA_10GE_PASSIVE_CP:
3234 case QLC_83XX_MODULE_DA_10GE_ACTIVE_CP:
3235 case QLC_83XX_MODULE_DA_10GE_LEGACY_CP:
3236 case QLC_83XX_MODULE_DA_1GE_PASSIVE_CP:
3237 ahw->supported_type = PORT_DA;
3238 ahw->port_type = QLCNIC_XGBE;
3239 break;
3240 default:
3241 ahw->supported_type = PORT_OTHER;
3242 ahw->port_type = QLCNIC_XGBE;
3195 } 3243 }
3196 if (config & 1) 3244 if (config & 1)
3197 err = 1; 3245 err = 1;
@@ -3204,9 +3252,9 @@ out:
3204int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter, 3252int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter,
3205 struct ethtool_cmd *ecmd) 3253 struct ethtool_cmd *ecmd)
3206{ 3254{
3255 struct qlcnic_hardware_context *ahw = adapter->ahw;
3207 u32 config = 0; 3256 u32 config = 0;
3208 int status = 0; 3257 int status = 0;
3209 struct qlcnic_hardware_context *ahw = adapter->ahw;
3210 3258
3211 if (!test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) { 3259 if (!test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) {
3212 /* Get port configuration info */ 3260 /* Get port configuration info */
@@ -3229,20 +3277,41 @@ int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter,
3229 ecmd->autoneg = AUTONEG_DISABLE; 3277 ecmd->autoneg = AUTONEG_DISABLE;
3230 } 3278 }
3231 3279
3232 if (ahw->port_type == QLCNIC_XGBE) { 3280 ecmd->supported = (SUPPORTED_10baseT_Full |
3233 ecmd->supported = SUPPORTED_10000baseT_Full; 3281 SUPPORTED_100baseT_Full |
3234 ecmd->advertising = ADVERTISED_10000baseT_Full; 3282 SUPPORTED_1000baseT_Full |
3283 SUPPORTED_10000baseT_Full |
3284 SUPPORTED_Autoneg);
3285
3286 if (ecmd->autoneg == AUTONEG_ENABLE) {
3287 if (ahw->port_config & QLC_83XX_10_CAPABLE)
3288 ecmd->advertising |= SUPPORTED_10baseT_Full;
3289 if (ahw->port_config & QLC_83XX_100_CAPABLE)
3290 ecmd->advertising |= SUPPORTED_100baseT_Full;
3291 if (ahw->port_config & QLC_83XX_1G_CAPABLE)
3292 ecmd->advertising |= SUPPORTED_1000baseT_Full;
3293 if (ahw->port_config & QLC_83XX_10G_CAPABLE)
3294 ecmd->advertising |= SUPPORTED_10000baseT_Full;
3295 if (ahw->port_config & QLC_83XX_AUTONEG_ENABLE)
3296 ecmd->advertising |= ADVERTISED_Autoneg;
3235 } else { 3297 } else {
3236 ecmd->supported = (SUPPORTED_10baseT_Half | 3298 switch (ahw->link_speed) {
3237 SUPPORTED_10baseT_Full | 3299 case SPEED_10:
3238 SUPPORTED_100baseT_Half | 3300 ecmd->advertising = SUPPORTED_10baseT_Full;
3239 SUPPORTED_100baseT_Full | 3301 break;
3240 SUPPORTED_1000baseT_Half | 3302 case SPEED_100:
3241 SUPPORTED_1000baseT_Full); 3303 ecmd->advertising = SUPPORTED_100baseT_Full;
3242 ecmd->advertising = (ADVERTISED_100baseT_Half | 3304 break;
3243 ADVERTISED_100baseT_Full | 3305 case SPEED_1000:
3244 ADVERTISED_1000baseT_Half | 3306 ecmd->advertising = SUPPORTED_1000baseT_Full;
3245 ADVERTISED_1000baseT_Full); 3307 break;
3308 case SPEED_10000:
3309 ecmd->advertising = SUPPORTED_10000baseT_Full;
3310 break;
3311 default:
3312 break;
3313 }
3314
3246 } 3315 }
3247 3316
3248 switch (ahw->supported_type) { 3317 switch (ahw->supported_type) {
@@ -3258,6 +3327,12 @@ int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter,
3258 ecmd->port = PORT_TP; 3327 ecmd->port = PORT_TP;
3259 ecmd->transceiver = XCVR_INTERNAL; 3328 ecmd->transceiver = XCVR_INTERNAL;
3260 break; 3329 break;
3330 case PORT_DA:
3331 ecmd->supported |= SUPPORTED_FIBRE;
3332 ecmd->advertising |= ADVERTISED_FIBRE;
3333 ecmd->port = PORT_DA;
3334 ecmd->transceiver = XCVR_EXTERNAL;
3335 break;
3261 default: 3336 default:
3262 ecmd->supported |= SUPPORTED_FIBRE; 3337 ecmd->supported |= SUPPORTED_FIBRE;
3263 ecmd->advertising |= ADVERTISED_FIBRE; 3338 ecmd->advertising |= ADVERTISED_FIBRE;
@@ -3272,35 +3347,60 @@ int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter,
3272int qlcnic_83xx_set_settings(struct qlcnic_adapter *adapter, 3347int qlcnic_83xx_set_settings(struct qlcnic_adapter *adapter,
3273 struct ethtool_cmd *ecmd) 3348 struct ethtool_cmd *ecmd)
3274{ 3349{
3275 int status = 0; 3350 struct qlcnic_hardware_context *ahw = adapter->ahw;
3276 u32 config = adapter->ahw->port_config; 3351 u32 config = adapter->ahw->port_config;
3352 int status = 0;
3277 3353
3278 if (ecmd->autoneg) 3354 /* 83xx devices do not support Half duplex */
3279 adapter->ahw->port_config |= BIT_15; 3355 if (ecmd->duplex == DUPLEX_HALF) {
3280 3356 netdev_info(adapter->netdev,
3281 switch (ethtool_cmd_speed(ecmd)) { 3357 "Half duplex mode not supported\n");
3282 case SPEED_10: 3358 return -EINVAL;
3283 adapter->ahw->port_config |= BIT_8;
3284 break;
3285 case SPEED_100:
3286 adapter->ahw->port_config |= BIT_9;
3287 break;
3288 case SPEED_1000:
3289 adapter->ahw->port_config |= BIT_10;
3290 break;
3291 case SPEED_10000:
3292 adapter->ahw->port_config |= BIT_11;
3293 break;
3294 default:
3295 return -EINVAL;
3296 } 3359 }
3297 3360
3361 if (ecmd->autoneg) {
3362 ahw->port_config |= QLC_83XX_AUTONEG_ENABLE;
3363 ahw->port_config |= (QLC_83XX_100_CAPABLE |
3364 QLC_83XX_1G_CAPABLE |
3365 QLC_83XX_10G_CAPABLE);
3366 } else { /* force speed */
3367 ahw->port_config &= ~QLC_83XX_AUTONEG_ENABLE;
3368 switch (ethtool_cmd_speed(ecmd)) {
3369 case SPEED_10:
3370 ahw->port_config &= ~(QLC_83XX_100_CAPABLE |
3371 QLC_83XX_1G_CAPABLE |
3372 QLC_83XX_10G_CAPABLE);
3373 ahw->port_config |= QLC_83XX_10_CAPABLE;
3374 break;
3375 case SPEED_100:
3376 ahw->port_config &= ~(QLC_83XX_10_CAPABLE |
3377 QLC_83XX_1G_CAPABLE |
3378 QLC_83XX_10G_CAPABLE);
3379 ahw->port_config |= QLC_83XX_100_CAPABLE;
3380 break;
3381 case SPEED_1000:
3382 ahw->port_config &= ~(QLC_83XX_10_CAPABLE |
3383 QLC_83XX_100_CAPABLE |
3384 QLC_83XX_10G_CAPABLE);
3385 ahw->port_config |= QLC_83XX_1G_CAPABLE;
3386 break;
3387 case SPEED_10000:
3388 ahw->port_config &= ~(QLC_83XX_10_CAPABLE |
3389 QLC_83XX_100_CAPABLE |
3390 QLC_83XX_1G_CAPABLE);
3391 ahw->port_config |= QLC_83XX_10G_CAPABLE;
3392 break;
3393 default:
3394 return -EINVAL;
3395 }
3396 }
3298 status = qlcnic_83xx_set_port_config(adapter); 3397 status = qlcnic_83xx_set_port_config(adapter);
3299 if (status) { 3398 if (status) {
3300 dev_info(&adapter->pdev->dev, 3399 netdev_info(adapter->netdev,
3301 "Failed to Set Link Speed and autoneg.\n"); 3400 "Failed to Set Link Speed and autoneg.\n");
3302 adapter->ahw->port_config = config; 3401 ahw->port_config = config;
3303 } 3402 }
3403
3304 return status; 3404 return status;
3305} 3405}
3306 3406
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
index 2bf101a47d02..f3346a3779d3 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
@@ -83,6 +83,7 @@
83/* Firmware image definitions */ 83/* Firmware image definitions */
84#define QLC_83XX_BOOTLOADER_FLASH_ADDR 0x10000 84#define QLC_83XX_BOOTLOADER_FLASH_ADDR 0x10000
85#define QLC_83XX_FW_FILE_NAME "83xx_fw.bin" 85#define QLC_83XX_FW_FILE_NAME "83xx_fw.bin"
86#define QLC_83XX_POST_FW_FILE_NAME "83xx_post_fw.bin"
86#define QLC_84XX_FW_FILE_NAME "84xx_fw.bin" 87#define QLC_84XX_FW_FILE_NAME "84xx_fw.bin"
87#define QLC_83XX_BOOT_FROM_FLASH 0 88#define QLC_83XX_BOOT_FROM_FLASH 0
88#define QLC_83XX_BOOT_FROM_FILE 0x12345678 89#define QLC_83XX_BOOT_FROM_FILE 0x12345678
@@ -360,7 +361,6 @@ enum qlcnic_83xx_states {
360#define QLC_83XX_SFP_MODULE_TYPE(data) (((data) >> 4) & 0x1F) 361#define QLC_83XX_SFP_MODULE_TYPE(data) (((data) >> 4) & 0x1F)
361#define QLC_83XX_SFP_CU_LENGTH(data) (LSB((data) >> 16)) 362#define QLC_83XX_SFP_CU_LENGTH(data) (LSB((data) >> 16))
362#define QLC_83XX_SFP_TX_FAULT(data) ((data) & BIT_10) 363#define QLC_83XX_SFP_TX_FAULT(data) ((data) & BIT_10)
363#define QLC_83XX_SFP_10G_CAPABLE(data) ((data) & BIT_11)
364#define QLC_83XX_LINK_STATS(data) ((data) & BIT_0) 364#define QLC_83XX_LINK_STATS(data) ((data) & BIT_0)
365#define QLC_83XX_CURRENT_LINK_SPEED(data) (((data) >> 3) & 7) 365#define QLC_83XX_CURRENT_LINK_SPEED(data) (((data) >> 3) & 7)
366#define QLC_83XX_LINK_PAUSE(data) (((data) >> 6) & 3) 366#define QLC_83XX_LINK_PAUSE(data) (((data) >> 6) & 3)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
index 86783e1afcf7..9a2cfe4efac6 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
@@ -2075,6 +2075,121 @@ static void qlcnic_83xx_init_hw(struct qlcnic_adapter *p_dev)
2075 dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__); 2075 dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
2076} 2076}
2077 2077
2078/* POST FW related definations*/
2079#define QLC_83XX_POST_SIGNATURE_REG 0x41602014
2080#define QLC_83XX_POST_MODE_REG 0x41602018
2081#define QLC_83XX_POST_FAST_MODE 0
2082#define QLC_83XX_POST_MEDIUM_MODE 1
2083#define QLC_83XX_POST_SLOW_MODE 2
2084
2085/* POST Timeout values in milliseconds */
2086#define QLC_83XX_POST_FAST_MODE_TIMEOUT 690
2087#define QLC_83XX_POST_MED_MODE_TIMEOUT 2930
2088#define QLC_83XX_POST_SLOW_MODE_TIMEOUT 7500
2089
2090/* POST result values */
2091#define QLC_83XX_POST_PASS 0xfffffff0
2092#define QLC_83XX_POST_ASIC_STRESS_TEST_FAIL 0xffffffff
2093#define QLC_83XX_POST_DDR_TEST_FAIL 0xfffffffe
2094#define QLC_83XX_POST_ASIC_MEMORY_TEST_FAIL 0xfffffffc
2095#define QLC_83XX_POST_FLASH_TEST_FAIL 0xfffffff8
2096
2097static int qlcnic_83xx_run_post(struct qlcnic_adapter *adapter)
2098{
2099 struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
2100 struct device *dev = &adapter->pdev->dev;
2101 int timeout, count, ret = 0;
2102 u32 signature;
2103
2104 /* Set timeout values with extra 2 seconds of buffer */
2105 switch (adapter->ahw->post_mode) {
2106 case QLC_83XX_POST_FAST_MODE:
2107 timeout = QLC_83XX_POST_FAST_MODE_TIMEOUT + 2000;
2108 break;
2109 case QLC_83XX_POST_MEDIUM_MODE:
2110 timeout = QLC_83XX_POST_MED_MODE_TIMEOUT + 2000;
2111 break;
2112 case QLC_83XX_POST_SLOW_MODE:
2113 timeout = QLC_83XX_POST_SLOW_MODE_TIMEOUT + 2000;
2114 break;
2115 default:
2116 return -EINVAL;
2117 }
2118
2119 strncpy(fw_info->fw_file_name, QLC_83XX_POST_FW_FILE_NAME,
2120 QLC_FW_FILE_NAME_LEN);
2121
2122 ret = request_firmware(&fw_info->fw, fw_info->fw_file_name, dev);
2123 if (ret) {
2124 dev_err(dev, "POST firmware can not be loaded, skipping POST\n");
2125 return 0;
2126 }
2127
2128 ret = qlcnic_83xx_copy_fw_file(adapter);
2129 if (ret)
2130 return ret;
2131
2132 /* clear QLC_83XX_POST_SIGNATURE_REG register */
2133 qlcnic_ind_wr(adapter, QLC_83XX_POST_SIGNATURE_REG, 0);
2134
2135 /* Set POST mode */
2136 qlcnic_ind_wr(adapter, QLC_83XX_POST_MODE_REG,
2137 adapter->ahw->post_mode);
2138
2139 QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
2140 QLC_83XX_BOOT_FROM_FILE);
2141
2142 qlcnic_83xx_start_hw(adapter);
2143
2144 count = 0;
2145 do {
2146 msleep(100);
2147 count += 100;
2148
2149 signature = qlcnic_ind_rd(adapter, QLC_83XX_POST_SIGNATURE_REG);
2150 if (signature == QLC_83XX_POST_PASS)
2151 break;
2152 } while (timeout > count);
2153
2154 if (timeout <= count) {
2155 dev_err(dev, "POST timed out, signature = 0x%08x\n", signature);
2156 return -EIO;
2157 }
2158
2159 switch (signature) {
2160 case QLC_83XX_POST_PASS:
2161 dev_info(dev, "POST passed, Signature = 0x%08x\n", signature);
2162 break;
2163 case QLC_83XX_POST_ASIC_STRESS_TEST_FAIL:
2164 dev_err(dev, "POST failed, Test case : ASIC STRESS TEST, Signature = 0x%08x\n",
2165 signature);
2166 ret = -EIO;
2167 break;
2168 case QLC_83XX_POST_DDR_TEST_FAIL:
2169 dev_err(dev, "POST failed, Test case : DDT TEST, Signature = 0x%08x\n",
2170 signature);
2171 ret = -EIO;
2172 break;
2173 case QLC_83XX_POST_ASIC_MEMORY_TEST_FAIL:
2174 dev_err(dev, "POST failed, Test case : ASIC MEMORY TEST, Signature = 0x%08x\n",
2175 signature);
2176 ret = -EIO;
2177 break;
2178 case QLC_83XX_POST_FLASH_TEST_FAIL:
2179 dev_err(dev, "POST failed, Test case : FLASH TEST, Signature = 0x%08x\n",
2180 signature);
2181 ret = -EIO;
2182 break;
2183 default:
2184 dev_err(dev, "POST failed, Test case : INVALID, Signature = 0x%08x\n",
2185 signature);
2186 ret = -EIO;
2187 break;
2188 }
2189
2190 return ret;
2191}
2192
2078static int qlcnic_83xx_load_fw_image_from_host(struct qlcnic_adapter *adapter) 2193static int qlcnic_83xx_load_fw_image_from_host(struct qlcnic_adapter *adapter)
2079{ 2194{
2080 struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info; 2195 struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
@@ -2119,8 +2234,27 @@ static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter)
2119 2234
2120 if (qlcnic_83xx_copy_bootloader(adapter)) 2235 if (qlcnic_83xx_copy_bootloader(adapter))
2121 return err; 2236 return err;
2237
2238 /* Check if POST needs to be run */
2239 if (adapter->ahw->run_post) {
2240 err = qlcnic_83xx_run_post(adapter);
2241 if (err)
2242 return err;
2243
2244 /* No need to run POST in next reset sequence */
2245 adapter->ahw->run_post = false;
2246
2247 /* Again reset the adapter to load regular firmware */
2248 qlcnic_83xx_stop_hw(adapter);
2249 qlcnic_83xx_init_hw(adapter);
2250
2251 err = qlcnic_83xx_copy_bootloader(adapter);
2252 if (err)
2253 return err;
2254 }
2255
2122 /* Boot either flash image or firmware image from host file system */ 2256 /* Boot either flash image or firmware image from host file system */
2123 if (qlcnic_load_fw_file) { 2257 if (qlcnic_load_fw_file == 1) {
2124 if (qlcnic_83xx_load_fw_image_from_host(adapter)) 2258 if (qlcnic_83xx_load_fw_image_from_host(adapter))
2125 return err; 2259 return err;
2126 } else { 2260 } else {
@@ -2284,6 +2418,7 @@ static int qlcnic_83xx_get_fw_info(struct qlcnic_adapter *adapter)
2284 fw_info = ahw->fw_info; 2418 fw_info = ahw->fw_info;
2285 switch (pdev->device) { 2419 switch (pdev->device) {
2286 case PCI_DEVICE_ID_QLOGIC_QLE834X: 2420 case PCI_DEVICE_ID_QLOGIC_QLE834X:
2421 case PCI_DEVICE_ID_QLOGIC_QLE8830:
2287 strncpy(fw_info->fw_file_name, QLC_83XX_FW_FILE_NAME, 2422 strncpy(fw_info->fw_file_name, QLC_83XX_FW_FILE_NAME,
2288 QLC_FW_FILE_NAME_LEN); 2423 QLC_FW_FILE_NAME_LEN);
2289 break; 2424 break;
@@ -2328,6 +2463,25 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
2328 adapter->rx_mac_learn = false; 2463 adapter->rx_mac_learn = false;
2329 ahw->msix_supported = !!qlcnic_use_msi_x; 2464 ahw->msix_supported = !!qlcnic_use_msi_x;
2330 2465
2466 /* Check if POST needs to be run */
2467 switch (qlcnic_load_fw_file) {
2468 case 2:
2469 ahw->post_mode = QLC_83XX_POST_FAST_MODE;
2470 ahw->run_post = true;
2471 break;
2472 case 3:
2473 ahw->post_mode = QLC_83XX_POST_MEDIUM_MODE;
2474 ahw->run_post = true;
2475 break;
2476 case 4:
2477 ahw->post_mode = QLC_83XX_POST_SLOW_MODE;
2478 ahw->run_post = true;
2479 break;
2480 default:
2481 ahw->run_post = false;
2482 break;
2483 }
2484
2331 qlcnic_83xx_init_rings(adapter); 2485 qlcnic_83xx_init_rings(adapter);
2332 2486
2333 err = qlcnic_83xx_init_mailbox_work(adapter); 2487 err = qlcnic_83xx_init_mailbox_work(adapter);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
index 851cb4a80d50..8102673cb37f 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
@@ -341,7 +341,7 @@ qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg)
341 } 341 }
342 return -EIO; 342 return -EIO;
343 } 343 }
344 msleep(1); 344 usleep_range(1000, 1500);
345 } 345 }
346 346
347 if (id_reg) 347 if (id_reg)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
index c4262c23ed7c..be41e4c77b65 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
@@ -537,7 +537,7 @@ int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)
537 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_3 + 0xc, 0); 537 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_3 + 0xc, 0);
538 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x8, 0); 538 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x8, 0);
539 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_4 + 0xc, 0); 539 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_4 + 0xc, 0);
540 msleep(1); 540 usleep_range(1000, 1500);
541 541
542 QLC_SHARED_REG_WR32(adapter, QLCNIC_PEG_HALT_STATUS1, 0); 542 QLC_SHARED_REG_WR32(adapter, QLCNIC_PEG_HALT_STATUS1, 0);
543 QLC_SHARED_REG_WR32(adapter, QLCNIC_PEG_HALT_STATUS2, 0); 543 QLC_SHARED_REG_WR32(adapter, QLCNIC_PEG_HALT_STATUS2, 0);
@@ -1198,7 +1198,7 @@ qlcnic_load_firmware(struct qlcnic_adapter *adapter)
1198 flashaddr += 8; 1198 flashaddr += 8;
1199 } 1199 }
1200 } 1200 }
1201 msleep(1); 1201 usleep_range(1000, 1500);
1202 1202
1203 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x18, 0x1020); 1203 QLCWR32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x18, 0x1020);
1204 QLCWR32(adapter, QLCNIC_ROMUSB_GLB_SW_RESET, 0x80001e); 1204 QLCWR32(adapter, QLCNIC_ROMUSB_GLB_SW_RESET, 0x80001e);
@@ -1295,7 +1295,7 @@ next:
1295 rc = qlcnic_validate_firmware(adapter); 1295 rc = qlcnic_validate_firmware(adapter);
1296 if (rc != 0) { 1296 if (rc != 0) {
1297 release_firmware(adapter->fw); 1297 release_firmware(adapter->fw);
1298 msleep(1); 1298 usleep_range(1000, 1500);
1299 goto next; 1299 goto next;
1300 } 1300 }
1301 } 1301 }
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index cf08b2de071e..f5e29f7bdae3 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -52,7 +52,7 @@ MODULE_PARM_DESC(auto_fw_reset, "Auto firmware reset (0=disabled, 1=enabled)");
52module_param_named(auto_fw_reset, qlcnic_auto_fw_reset, int, 0644); 52module_param_named(auto_fw_reset, qlcnic_auto_fw_reset, int, 0644);
53 53
54int qlcnic_load_fw_file; 54int qlcnic_load_fw_file;
55MODULE_PARM_DESC(load_fw_file, "Load firmware from (0=flash, 1=file)"); 55MODULE_PARM_DESC(load_fw_file, "Load firmware from (0=flash, 1=file, 2=POST in fast mode, 3= POST in medium mode, 4=POST in slow mode)");
56module_param_named(load_fw_file, qlcnic_load_fw_file, int, 0444); 56module_param_named(load_fw_file, qlcnic_load_fw_file, int, 0444);
57 57
58static int qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent); 58static int qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
@@ -111,6 +111,7 @@ static u32 qlcnic_vlan_tx_check(struct qlcnic_adapter *adapter)
111static const struct pci_device_id qlcnic_pci_tbl[] = { 111static const struct pci_device_id qlcnic_pci_tbl[] = {
112 ENTRY(PCI_DEVICE_ID_QLOGIC_QLE824X), 112 ENTRY(PCI_DEVICE_ID_QLOGIC_QLE824X),
113 ENTRY(PCI_DEVICE_ID_QLOGIC_QLE834X), 113 ENTRY(PCI_DEVICE_ID_QLOGIC_QLE834X),
114 ENTRY(PCI_DEVICE_ID_QLOGIC_QLE8830),
114 ENTRY(PCI_DEVICE_ID_QLOGIC_VF_QLE834X), 115 ENTRY(PCI_DEVICE_ID_QLOGIC_VF_QLE834X),
115 ENTRY(PCI_DEVICE_ID_QLOGIC_QLE844X), 116 ENTRY(PCI_DEVICE_ID_QLOGIC_QLE844X),
116 ENTRY(PCI_DEVICE_ID_QLOGIC_VF_QLE844X), 117 ENTRY(PCI_DEVICE_ID_QLOGIC_VF_QLE844X),
@@ -228,6 +229,11 @@ static const struct qlcnic_board_info qlcnic_boards[] = {
228 PCI_DEVICE_ID_QLOGIC_QLE834X, 229 PCI_DEVICE_ID_QLOGIC_QLE834X,
229 0x0, 0x0, "8300 Series 1/10GbE Controller" }, 230 0x0, 0x0, "8300 Series 1/10GbE Controller" },
230 { PCI_VENDOR_ID_QLOGIC, 231 { PCI_VENDOR_ID_QLOGIC,
232 PCI_DEVICE_ID_QLOGIC_QLE8830,
233 0x0,
234 0x0,
235 "8830 Series 1/10GbE Controller" },
236 { PCI_VENDOR_ID_QLOGIC,
231 PCI_DEVICE_ID_QLOGIC_QLE824X, 237 PCI_DEVICE_ID_QLOGIC_QLE824X,
232 PCI_VENDOR_ID_QLOGIC, 238 PCI_VENDOR_ID_QLOGIC,
233 0x203, 239 0x203,
@@ -1131,6 +1137,7 @@ static void qlcnic_get_bar_length(u32 dev_id, ulong *bar)
1131 *bar = QLCNIC_82XX_BAR0_LENGTH; 1137 *bar = QLCNIC_82XX_BAR0_LENGTH;
1132 break; 1138 break;
1133 case PCI_DEVICE_ID_QLOGIC_QLE834X: 1139 case PCI_DEVICE_ID_QLOGIC_QLE834X:
1140 case PCI_DEVICE_ID_QLOGIC_QLE8830:
1134 case PCI_DEVICE_ID_QLOGIC_QLE844X: 1141 case PCI_DEVICE_ID_QLOGIC_QLE844X:
1135 case PCI_DEVICE_ID_QLOGIC_VF_QLE834X: 1142 case PCI_DEVICE_ID_QLOGIC_VF_QLE834X:
1136 case PCI_DEVICE_ID_QLOGIC_VF_QLE844X: 1143 case PCI_DEVICE_ID_QLOGIC_VF_QLE844X:
@@ -2474,6 +2481,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2474 ahw->reg_tbl = (u32 *) qlcnic_reg_tbl; 2481 ahw->reg_tbl = (u32 *) qlcnic_reg_tbl;
2475 break; 2482 break;
2476 case PCI_DEVICE_ID_QLOGIC_QLE834X: 2483 case PCI_DEVICE_ID_QLOGIC_QLE834X:
2484 case PCI_DEVICE_ID_QLOGIC_QLE8830:
2477 case PCI_DEVICE_ID_QLOGIC_QLE844X: 2485 case PCI_DEVICE_ID_QLOGIC_QLE844X:
2478 qlcnic_83xx_register_map(ahw); 2486 qlcnic_83xx_register_map(ahw);
2479 break; 2487 break;