diff options
Diffstat (limited to 'drivers/net/ethernet/broadcom')
27 files changed, 3491 insertions, 1964 deletions
| diff --git a/drivers/net/ethernet/broadcom/Kconfig b/drivers/net/ethernet/broadcom/Kconfig index 4bd416b72e65..f55267363f35 100644 --- a/drivers/net/ethernet/broadcom/Kconfig +++ b/drivers/net/ethernet/broadcom/Kconfig @@ -102,6 +102,7 @@ config TIGON3  	depends on PCI  	select PHYLIB  	select HWMON +	select PTP_1588_CLOCK  	---help---  	  This driver supports Broadcom Tigon3 based gigabit Ethernet cards. diff --git a/drivers/net/ethernet/broadcom/b44.c b/drivers/net/ethernet/broadcom/b44.c index 9786c0e9890e..219f6226fcb1 100644 --- a/drivers/net/ethernet/broadcom/b44.c +++ b/drivers/net/ethernet/broadcom/b44.c @@ -2083,7 +2083,7 @@ out:  	return err;  } -static int __devinit b44_get_invariants(struct b44 *bp) +static int b44_get_invariants(struct b44 *bp)  {  	struct ssb_device *sdev = bp->sdev;  	int err = 0; @@ -2141,8 +2141,8 @@ static const struct net_device_ops b44_netdev_ops = {  #endif  }; -static int __devinit b44_init_one(struct ssb_device *sdev, -				  const struct ssb_device_id *ent) +static int b44_init_one(struct ssb_device *sdev, +			const struct ssb_device_id *ent)  {  	struct net_device *dev;  	struct b44 *bp; @@ -2249,7 +2249,7 @@ out:  	return err;  } -static void __devexit b44_remove_one(struct ssb_device *sdev) +static void b44_remove_one(struct ssb_device *sdev)  {  	struct net_device *dev = ssb_get_drvdata(sdev); @@ -2340,7 +2340,7 @@ static struct ssb_driver b44_ssb_driver = {  	.name		= DRV_MODULE_NAME,  	.id_table	= b44_ssb_tbl,  	.probe		= b44_init_one, -	.remove		= __devexit_p(b44_remove_one), +	.remove		= b44_remove_one,  	.suspend	= b44_suspend,  	.resume		= b44_resume,  }; diff --git a/drivers/net/ethernet/broadcom/bcm63xx_enet.c b/drivers/net/ethernet/broadcom/bcm63xx_enet.c index c7ca7ec065ee..39387d67b722 100644 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c @@ -1612,7 +1612,7 @@ static const struct net_device_ops bcm_enet_ops = {  /*   * allocate netdevice, request register memory and register device.   */ -static int __devinit bcm_enet_probe(struct platform_device *pdev) +static int bcm_enet_probe(struct platform_device *pdev)  {  	struct bcm_enet_priv *priv;  	struct net_device *dev; @@ -1830,7 +1830,7 @@ out:  /*   * exit func, stops hardware and unregisters netdevice   */ -static int __devexit bcm_enet_remove(struct platform_device *pdev) +static int bcm_enet_remove(struct platform_device *pdev)  {  	struct bcm_enet_priv *priv;  	struct net_device *dev; @@ -1877,7 +1877,7 @@ static int __devexit bcm_enet_remove(struct platform_device *pdev)  struct platform_driver bcm63xx_enet_driver = {  	.probe	= bcm_enet_probe, -	.remove	= __devexit_p(bcm_enet_remove), +	.remove	= bcm_enet_remove,  	.driver	= {  		.name	= "bcm63xx_enet",  		.owner  = THIS_MODULE, @@ -1887,7 +1887,7 @@ struct platform_driver bcm63xx_enet_driver = {  /*   * reserve & remap memory space shared between all macs   */ -static int __devinit bcm_enet_shared_probe(struct platform_device *pdev) +static int bcm_enet_shared_probe(struct platform_device *pdev)  {  	struct resource *res;  	unsigned int iomem_size; @@ -1908,7 +1908,7 @@ static int __devinit bcm_enet_shared_probe(struct platform_device *pdev)  	return 0;  } -static int __devexit bcm_enet_shared_remove(struct platform_device *pdev) +static int bcm_enet_shared_remove(struct platform_device *pdev)  {  	struct resource *res; @@ -1924,7 +1924,7 @@ static int __devexit bcm_enet_shared_remove(struct platform_device *pdev)   */  struct platform_driver bcm63xx_enet_shared_driver = {  	.probe	= bcm_enet_shared_probe, -	.remove	= __devexit_p(bcm_enet_shared_remove), +	.remove	= bcm_enet_shared_remove,  	.driver	= {  		.name	= "bcm63xx_enet_shared",  		.owner  = THIS_MODULE, diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c index d4310700c7a7..a1adfaf87f49 100644 --- a/drivers/net/ethernet/broadcom/bnx2.c +++ b/drivers/net/ethernet/broadcom/bnx2.c @@ -71,7 +71,7 @@  /* Time in jiffies before concluding the transmitter is hung. */  #define TX_TIMEOUT  (5*HZ) -static char version[] __devinitdata = +static char version[] =  	"Broadcom NetXtreme II Gigabit Ethernet Driver " DRV_MODULE_NAME " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";  MODULE_AUTHOR("Michael Chan <[email protected]>"); @@ -106,7 +106,7 @@ typedef enum {  /* indexed by board_t, above */  static struct {  	char *name; -} board_info[] __devinitdata = { +} board_info[] = {  	{ "Broadcom NetXtreme II BCM5706 1000Base-T" },  	{ "HP NC370T Multifunction Gigabit Server Adapter" },  	{ "HP NC370i Multifunction Gigabit Server Adapter" }, @@ -260,10 +260,10 @@ static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_tx_ring_info *txr)  	 * needs to be skipped.  	 */  	diff = txr->tx_prod - txr->tx_cons; -	if (unlikely(diff >= TX_DESC_CNT)) { +	if (unlikely(diff >= BNX2_TX_DESC_CNT)) {  		diff &= 0xffff; -		if (diff == TX_DESC_CNT) -			diff = MAX_TX_DESC_CNT; +		if (diff == BNX2_TX_DESC_CNT) +			diff = BNX2_MAX_TX_DESC_CNT;  	}  	return bp->tx_ring_size - diff;  } @@ -274,8 +274,8 @@ bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset)  	u32 val;  	spin_lock_bh(&bp->indirect_lock); -	REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset); -	val = REG_RD(bp, BNX2_PCICFG_REG_WINDOW); +	BNX2_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset); +	val = BNX2_RD(bp, BNX2_PCICFG_REG_WINDOW);  	spin_unlock_bh(&bp->indirect_lock);  	return val;  } @@ -284,8 +284,8 @@ static void  bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val)  {  	spin_lock_bh(&bp->indirect_lock); -	REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset); -	REG_WR(bp, BNX2_PCICFG_REG_WINDOW, val); +	BNX2_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset); +	BNX2_WR(bp, BNX2_PCICFG_REG_WINDOW, val);  	spin_unlock_bh(&bp->indirect_lock);  } @@ -306,21 +306,21 @@ bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val)  {  	offset += cid_addr;  	spin_lock_bh(&bp->indirect_lock); -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {  		int i; -		REG_WR(bp, BNX2_CTX_CTX_DATA, val); -		REG_WR(bp, BNX2_CTX_CTX_CTRL, -		       offset | BNX2_CTX_CTX_CTRL_WRITE_REQ); +		BNX2_WR(bp, BNX2_CTX_CTX_DATA, val); +		BNX2_WR(bp, BNX2_CTX_CTX_CTRL, +			offset | BNX2_CTX_CTX_CTRL_WRITE_REQ);  		for (i = 0; i < 5; i++) { -			val = REG_RD(bp, BNX2_CTX_CTX_CTRL); +			val = BNX2_RD(bp, BNX2_CTX_CTX_CTRL);  			if ((val & BNX2_CTX_CTX_CTRL_WRITE_REQ) == 0)  				break;  			udelay(5);  		}  	} else { -		REG_WR(bp, BNX2_CTX_DATA_ADR, offset); -		REG_WR(bp, BNX2_CTX_DATA, val); +		BNX2_WR(bp, BNX2_CTX_DATA_ADR, offset); +		BNX2_WR(bp, BNX2_CTX_DATA, val);  	}  	spin_unlock_bh(&bp->indirect_lock);  } @@ -434,7 +434,6 @@ struct cnic_eth_dev *bnx2_cnic_probe(struct net_device *dev)  	return cp;  } -EXPORT_SYMBOL(bnx2_cnic_probe);  static void  bnx2_cnic_stop(struct bnx2 *bp) @@ -494,11 +493,11 @@ bnx2_read_phy(struct bnx2 *bp, u32 reg, u32 *val)  	int i, ret;  	if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) { -		val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE); +		val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);  		val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL; -		REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1); -		REG_RD(bp, BNX2_EMAC_MDIO_MODE); +		BNX2_WR(bp, BNX2_EMAC_MDIO_MODE, val1); +		BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);  		udelay(40);  	} @@ -506,16 +505,16 @@ bnx2_read_phy(struct bnx2 *bp, u32 reg, u32 *val)  	val1 = (bp->phy_addr << 21) | (reg << 16) |  		BNX2_EMAC_MDIO_COMM_COMMAND_READ | BNX2_EMAC_MDIO_COMM_DISEXT |  		BNX2_EMAC_MDIO_COMM_START_BUSY; -	REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1); +	BNX2_WR(bp, BNX2_EMAC_MDIO_COMM, val1);  	for (i = 0; i < 50; i++) {  		udelay(10); -		val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM); +		val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_COMM);  		if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {  			udelay(5); -			val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM); +			val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_COMM);  			val1 &= BNX2_EMAC_MDIO_COMM_DATA;  			break; @@ -532,11 +531,11 @@ bnx2_read_phy(struct bnx2 *bp, u32 reg, u32 *val)  	}  	if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) { -		val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE); +		val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);  		val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL; -		REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1); -		REG_RD(bp, BNX2_EMAC_MDIO_MODE); +		BNX2_WR(bp, BNX2_EMAC_MDIO_MODE, val1); +		BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);  		udelay(40);  	} @@ -551,11 +550,11 @@ bnx2_write_phy(struct bnx2 *bp, u32 reg, u32 val)  	int i, ret;  	if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) { -		val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE); +		val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);  		val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL; -		REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1); -		REG_RD(bp, BNX2_EMAC_MDIO_MODE); +		BNX2_WR(bp, BNX2_EMAC_MDIO_MODE, val1); +		BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);  		udelay(40);  	} @@ -563,12 +562,12 @@ bnx2_write_phy(struct bnx2 *bp, u32 reg, u32 val)  	val1 = (bp->phy_addr << 21) | (reg << 16) | val |  		BNX2_EMAC_MDIO_COMM_COMMAND_WRITE |  		BNX2_EMAC_MDIO_COMM_START_BUSY | BNX2_EMAC_MDIO_COMM_DISEXT; -	REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1); +	BNX2_WR(bp, BNX2_EMAC_MDIO_COMM, val1);  	for (i = 0; i < 50; i++) {  		udelay(10); -		val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM); +		val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_COMM);  		if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {  			udelay(5);  			break; @@ -581,11 +580,11 @@ bnx2_write_phy(struct bnx2 *bp, u32 reg, u32 val)  		ret = 0;  	if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) { -		val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE); +		val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);  		val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL; -		REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1); -		REG_RD(bp, BNX2_EMAC_MDIO_MODE); +		BNX2_WR(bp, BNX2_EMAC_MDIO_MODE, val1); +		BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);  		udelay(40);  	} @@ -601,10 +600,10 @@ bnx2_disable_int(struct bnx2 *bp)  	for (i = 0; i < bp->irq_nvecs; i++) {  		bnapi = &bp->bnx2_napi[i]; -		REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num | +		BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |  		       BNX2_PCICFG_INT_ACK_CMD_MASK_INT);  	} -	REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD); +	BNX2_RD(bp, BNX2_PCICFG_INT_ACK_CMD);  }  static void @@ -616,16 +615,16 @@ bnx2_enable_int(struct bnx2 *bp)  	for (i = 0; i < bp->irq_nvecs; i++) {  		bnapi = &bp->bnx2_napi[i]; -		REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num | -		       BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | -		       BNX2_PCICFG_INT_ACK_CMD_MASK_INT | -		       bnapi->last_status_idx); +		BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num | +			BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | +			BNX2_PCICFG_INT_ACK_CMD_MASK_INT | +			bnapi->last_status_idx); -		REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num | -		       BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | -		       bnapi->last_status_idx); +		BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num | +			BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | +			bnapi->last_status_idx);  	} -	REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW); +	BNX2_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW);  }  static void @@ -824,7 +823,7 @@ bnx2_free_mem(struct bnx2 *bp)  	for (i = 0; i < bp->ctx_pages; i++) {  		if (bp->ctx_blk[i]) { -			dma_free_coherent(&bp->pdev->dev, BCM_PAGE_SIZE, +			dma_free_coherent(&bp->pdev->dev, BNX2_PAGE_SIZE,  					  bp->ctx_blk[i],  					  bp->ctx_blk_mapping[i]);  			bp->ctx_blk[i] = NULL; @@ -887,13 +886,13 @@ bnx2_alloc_mem(struct bnx2 *bp)  	bp->stats_blk_mapping = bp->status_blk_mapping + status_blk_size; -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { -		bp->ctx_pages = 0x2000 / BCM_PAGE_SIZE; +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) { +		bp->ctx_pages = 0x2000 / BNX2_PAGE_SIZE;  		if (bp->ctx_pages == 0)  			bp->ctx_pages = 1;  		for (i = 0; i < bp->ctx_pages; i++) {  			bp->ctx_blk[i] = dma_alloc_coherent(&bp->pdev->dev, -						BCM_PAGE_SIZE, +						BNX2_PAGE_SIZE,  						&bp->ctx_blk_mapping[i],  						GFP_KERNEL);  			if (bp->ctx_blk[i] == NULL) @@ -1034,7 +1033,7 @@ bnx2_resolve_flow_ctrl(struct bnx2 *bp)  	}  	if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) && -	    (CHIP_NUM(bp) == CHIP_NUM_5708)) { +	    (BNX2_CHIP(bp) == BNX2_CHIP_5708)) {  		u32 val;  		bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val); @@ -1294,14 +1293,14 @@ bnx2_set_mac_link(struct bnx2 *bp)  {  	u32 val; -	REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x2620); +	BNX2_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x2620);  	if (bp->link_up && (bp->line_speed == SPEED_1000) &&  		(bp->duplex == DUPLEX_HALF)) { -		REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x26ff); +		BNX2_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x26ff);  	}  	/* Configure the EMAC mode register. */ -	val = REG_RD(bp, BNX2_EMAC_MODE); +	val = BNX2_RD(bp, BNX2_EMAC_MODE);  	val &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX |  		BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK | @@ -1310,7 +1309,7 @@ bnx2_set_mac_link(struct bnx2 *bp)  	if (bp->link_up) {  		switch (bp->line_speed) {  			case SPEED_10: -				if (CHIP_NUM(bp) != CHIP_NUM_5706) { +				if (BNX2_CHIP(bp) != BNX2_CHIP_5706) {  					val |= BNX2_EMAC_MODE_PORT_MII_10M;  					break;  				} @@ -1333,25 +1332,25 @@ bnx2_set_mac_link(struct bnx2 *bp)  	/* Set the MAC to operate in the appropriate duplex mode. */  	if (bp->duplex == DUPLEX_HALF)  		val |= BNX2_EMAC_MODE_HALF_DUPLEX; -	REG_WR(bp, BNX2_EMAC_MODE, val); +	BNX2_WR(bp, BNX2_EMAC_MODE, val);  	/* Enable/disable rx PAUSE. */  	bp->rx_mode &= ~BNX2_EMAC_RX_MODE_FLOW_EN;  	if (bp->flow_ctrl & FLOW_CTRL_RX)  		bp->rx_mode |= BNX2_EMAC_RX_MODE_FLOW_EN; -	REG_WR(bp, BNX2_EMAC_RX_MODE, bp->rx_mode); +	BNX2_WR(bp, BNX2_EMAC_RX_MODE, bp->rx_mode);  	/* Enable/disable tx PAUSE. */ -	val = REG_RD(bp, BNX2_EMAC_TX_MODE); +	val = BNX2_RD(bp, BNX2_EMAC_TX_MODE);  	val &= ~BNX2_EMAC_TX_MODE_FLOW_EN;  	if (bp->flow_ctrl & FLOW_CTRL_TX)  		val |= BNX2_EMAC_TX_MODE_FLOW_EN; -	REG_WR(bp, BNX2_EMAC_TX_MODE, val); +	BNX2_WR(bp, BNX2_EMAC_TX_MODE, val);  	/* Acknowledge the interrupt. */ -	REG_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE); +	BNX2_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE);  	bnx2_init_all_rx_contexts(bp);  } @@ -1360,7 +1359,7 @@ static void  bnx2_enable_bmsr1(struct bnx2 *bp)  {  	if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) && -	    (CHIP_NUM(bp) == CHIP_NUM_5709)) +	    (BNX2_CHIP(bp) == BNX2_CHIP_5709))  		bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,  			       MII_BNX2_BLK_ADDR_GP_STATUS);  } @@ -1369,7 +1368,7 @@ static void  bnx2_disable_bmsr1(struct bnx2 *bp)  {  	if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) && -	    (CHIP_NUM(bp) == CHIP_NUM_5709)) +	    (BNX2_CHIP(bp) == BNX2_CHIP_5709))  		bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,  			       MII_BNX2_BLK_ADDR_COMBO_IEEEB0);  } @@ -1386,7 +1385,7 @@ bnx2_test_and_enable_2g5(struct bnx2 *bp)  	if (bp->autoneg & AUTONEG_SPEED)  		bp->advertising |= ADVERTISED_2500baseX_Full; -	if (CHIP_NUM(bp) == CHIP_NUM_5709) +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709)  		bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G);  	bnx2_read_phy(bp, bp->mii_up1, &up1); @@ -1396,7 +1395,7 @@ bnx2_test_and_enable_2g5(struct bnx2 *bp)  		ret = 0;  	} -	if (CHIP_NUM(bp) == CHIP_NUM_5709) +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709)  		bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,  			       MII_BNX2_BLK_ADDR_COMBO_IEEEB0); @@ -1412,7 +1411,7 @@ bnx2_test_and_disable_2g5(struct bnx2 *bp)  	if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))  		return 0; -	if (CHIP_NUM(bp) == CHIP_NUM_5709) +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709)  		bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G);  	bnx2_read_phy(bp, bp->mii_up1, &up1); @@ -1422,7 +1421,7 @@ bnx2_test_and_disable_2g5(struct bnx2 *bp)  		ret = 1;  	} -	if (CHIP_NUM(bp) == CHIP_NUM_5709) +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709)  		bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,  			       MII_BNX2_BLK_ADDR_COMBO_IEEEB0); @@ -1438,7 +1437,7 @@ bnx2_enable_forced_2g5(struct bnx2 *bp)  	if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))  		return; -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {  		u32 val;  		bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, @@ -1454,7 +1453,7 @@ bnx2_enable_forced_2g5(struct bnx2 *bp)  			       MII_BNX2_BLK_ADDR_COMBO_IEEEB0);  		err = bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); -	} else if (CHIP_NUM(bp) == CHIP_NUM_5708) { +	} else if (BNX2_CHIP(bp) == BNX2_CHIP_5708) {  		err = bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);  		if (!err)  			bmcr |= BCM5708S_BMCR_FORCE_2500; @@ -1482,7 +1481,7 @@ bnx2_disable_forced_2g5(struct bnx2 *bp)  	if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))  		return; -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {  		u32 val;  		bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, @@ -1496,7 +1495,7 @@ bnx2_disable_forced_2g5(struct bnx2 *bp)  			       MII_BNX2_BLK_ADDR_COMBO_IEEEB0);  		err = bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); -	} else if (CHIP_NUM(bp) == CHIP_NUM_5708) { +	} else if (BNX2_CHIP(bp) == BNX2_CHIP_5708) {  		err = bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);  		if (!err)  			bmcr &= ~BCM5708S_BMCR_FORCE_2500; @@ -1547,14 +1546,14 @@ bnx2_set_link(struct bnx2 *bp)  	bnx2_disable_bmsr1(bp);  	if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) && -	    (CHIP_NUM(bp) == CHIP_NUM_5706)) { +	    (BNX2_CHIP(bp) == BNX2_CHIP_5706)) {  		u32 val, an_dbg;  		if (bp->phy_flags & BNX2_PHY_FLAG_FORCED_DOWN) {  			bnx2_5706s_force_link_dn(bp, 0);  			bp->phy_flags &= ~BNX2_PHY_FLAG_FORCED_DOWN;  		} -		val = REG_RD(bp, BNX2_EMAC_STATUS); +		val = BNX2_RD(bp, BNX2_EMAC_STATUS);  		bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_AN_DBG);  		bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg); @@ -1571,11 +1570,11 @@ bnx2_set_link(struct bnx2 *bp)  		bp->link_up = 1;  		if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { -			if (CHIP_NUM(bp) == CHIP_NUM_5706) +			if (BNX2_CHIP(bp) == BNX2_CHIP_5706)  				bnx2_5706s_linkup(bp); -			else if (CHIP_NUM(bp) == CHIP_NUM_5708) +			else if (BNX2_CHIP(bp) == BNX2_CHIP_5708)  				bnx2_5708s_linkup(bp); -			else if (CHIP_NUM(bp) == CHIP_NUM_5709) +			else if (BNX2_CHIP(bp) == BNX2_CHIP_5709)  				bnx2_5709s_linkup(bp);  		}  		else { @@ -1757,7 +1756,7 @@ __acquires(&bp->phy_lock)  		new_bmcr = bmcr & ~BMCR_ANENABLE;  		new_bmcr |= BMCR_SPEED1000; -		if (CHIP_NUM(bp) == CHIP_NUM_5709) { +		if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {  			if (bp->req_line_speed == SPEED_2500)  				bnx2_enable_forced_2g5(bp);  			else if (bp->req_line_speed == SPEED_1000) { @@ -1765,7 +1764,7 @@ __acquires(&bp->phy_lock)  				new_bmcr &= ~0x2000;  			} -		} else if (CHIP_NUM(bp) == CHIP_NUM_5708) { +		} else if (BNX2_CHIP(bp) == BNX2_CHIP_5708) {  			if (bp->req_line_speed == SPEED_2500)  				new_bmcr |= BCM5708S_BMCR_FORCE_2500;  			else @@ -1942,8 +1941,8 @@ bnx2_send_heart_beat(struct bnx2 *bp)  	spin_lock(&bp->indirect_lock);  	msg = (u32) (++bp->fw_drv_pulse_wr_seq & BNX2_DRV_PULSE_SEQ_MASK);  	addr = bp->shmem_base + BNX2_DRV_PULSE_MB; -	REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, addr); -	REG_WR(bp, BNX2_PCICFG_REG_WINDOW, msg); +	BNX2_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, addr); +	BNX2_WR(bp, BNX2_PCICFG_REG_WINDOW, msg);  	spin_unlock(&bp->indirect_lock);  } @@ -2230,9 +2229,9 @@ bnx2_init_5708s_phy(struct bnx2 *bp, int reset_phy)  		bnx2_write_phy(bp, BCM5708S_UP1, val);  	} -	if ((CHIP_ID(bp) == CHIP_ID_5708_A0) || -	    (CHIP_ID(bp) == CHIP_ID_5708_B0) || -	    (CHIP_ID(bp) == CHIP_ID_5708_B1)) { +	if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_A0) || +	    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_B0) || +	    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_B1)) {  		/* increase tx signal amplitude */  		bnx2_write_phy(bp, BCM5708S_BLK_ADDR,  			       BCM5708S_BLK_ADDR_TX_MISC); @@ -2268,8 +2267,8 @@ bnx2_init_5706s_phy(struct bnx2 *bp, int reset_phy)  	bp->phy_flags &= ~BNX2_PHY_FLAG_PARALLEL_DETECT; -	if (CHIP_NUM(bp) == CHIP_NUM_5706) -        	REG_WR(bp, BNX2_MISC_GP_HW_CTL0, 0x300); +	if (BNX2_CHIP(bp) == BNX2_CHIP_5706) +		BNX2_WR(bp, BNX2_MISC_GP_HW_CTL0, 0x300);  	if (bp->dev->mtu > 1500) {  		u32 val; @@ -2368,7 +2367,7 @@ __acquires(&bp->phy_lock)  	bp->mii_adv = MII_ADVERTISE;  	bp->mii_lpa = MII_LPA; -        REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK); +	BNX2_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);  	if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)  		goto setup_phy; @@ -2379,11 +2378,11 @@ __acquires(&bp->phy_lock)  	bp->phy_id |= val & 0xffff;  	if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { -		if (CHIP_NUM(bp) == CHIP_NUM_5706) +		if (BNX2_CHIP(bp) == BNX2_CHIP_5706)  			rc = bnx2_init_5706s_phy(bp, reset_phy); -		else if (CHIP_NUM(bp) == CHIP_NUM_5708) +		else if (BNX2_CHIP(bp) == BNX2_CHIP_5708)  			rc = bnx2_init_5708s_phy(bp, reset_phy); -		else if (CHIP_NUM(bp) == CHIP_NUM_5709) +		else if (BNX2_CHIP(bp) == BNX2_CHIP_5709)  			rc = bnx2_init_5709s_phy(bp, reset_phy);  	}  	else { @@ -2402,10 +2401,10 @@ bnx2_set_mac_loopback(struct bnx2 *bp)  {  	u32 mac_mode; -	mac_mode = REG_RD(bp, BNX2_EMAC_MODE); +	mac_mode = BNX2_RD(bp, BNX2_EMAC_MODE);  	mac_mode &= ~BNX2_EMAC_MODE_PORT;  	mac_mode |= BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK; -	REG_WR(bp, BNX2_EMAC_MODE, mac_mode); +	BNX2_WR(bp, BNX2_EMAC_MODE, mac_mode);  	bp->link_up = 1;  	return 0;  } @@ -2431,13 +2430,13 @@ bnx2_set_phy_loopback(struct bnx2 *bp)  		msleep(100);  	} -	mac_mode = REG_RD(bp, BNX2_EMAC_MODE); +	mac_mode = BNX2_RD(bp, BNX2_EMAC_MODE);  	mac_mode &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX |  		      BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK |  		      BNX2_EMAC_MODE_25G_MODE);  	mac_mode |= BNX2_EMAC_MODE_PORT_GMII; -	REG_WR(bp, BNX2_EMAC_MODE, mac_mode); +	BNX2_WR(bp, BNX2_EMAC_MODE, mac_mode);  	bp->link_up = 1;  	return 0;  } @@ -2449,7 +2448,7 @@ bnx2_dump_mcp_state(struct bnx2 *bp)  	u32 mcp_p0, mcp_p1;  	netdev_err(dev, "<--- start MCP states dump --->\n"); -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {  		mcp_p0 = BNX2_MCP_STATE_P0;  		mcp_p1 = BNX2_MCP_STATE_P1;  	} else { @@ -2538,10 +2537,10 @@ bnx2_init_5709_context(struct bnx2 *bp)  	u32 val;  	val = BNX2_CTX_COMMAND_ENABLED | BNX2_CTX_COMMAND_MEM_INIT | (1 << 12); -	val |= (BCM_PAGE_BITS - 8) << 16; -	REG_WR(bp, BNX2_CTX_COMMAND, val); +	val |= (BNX2_PAGE_BITS - 8) << 16; +	BNX2_WR(bp, BNX2_CTX_COMMAND, val);  	for (i = 0; i < 10; i++) { -		val = REG_RD(bp, BNX2_CTX_COMMAND); +		val = BNX2_RD(bp, BNX2_CTX_COMMAND);  		if (!(val & BNX2_CTX_COMMAND_MEM_INIT))  			break;  		udelay(2); @@ -2553,20 +2552,20 @@ bnx2_init_5709_context(struct bnx2 *bp)  		int j;  		if (bp->ctx_blk[i]) -			memset(bp->ctx_blk[i], 0, BCM_PAGE_SIZE); +			memset(bp->ctx_blk[i], 0, BNX2_PAGE_SIZE);  		else  			return -ENOMEM; -		REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA0, -		       (bp->ctx_blk_mapping[i] & 0xffffffff) | -		       BNX2_CTX_HOST_PAGE_TBL_DATA0_VALID); -		REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA1, -		       (u64) bp->ctx_blk_mapping[i] >> 32); -		REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL, i | -		       BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ); +		BNX2_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA0, +			(bp->ctx_blk_mapping[i] & 0xffffffff) | +			BNX2_CTX_HOST_PAGE_TBL_DATA0_VALID); +		BNX2_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA1, +			(u64) bp->ctx_blk_mapping[i] >> 32); +		BNX2_WR(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL, i | +			BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ);  		for (j = 0; j < 10; j++) { -			val = REG_RD(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL); +			val = BNX2_RD(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL);  			if (!(val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ))  				break;  			udelay(5); @@ -2591,7 +2590,7 @@ bnx2_init_context(struct bnx2 *bp)  		vcid--; -		if (CHIP_ID(bp) == CHIP_ID_5706_A0) { +		if (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) {  			u32 new_vcid;  			vcid_addr = GET_PCID_ADDR(vcid); @@ -2612,8 +2611,8 @@ bnx2_init_context(struct bnx2 *bp)  			vcid_addr += (i << PHY_CTX_SHIFT);  			pcid_addr += (i << PHY_CTX_SHIFT); -			REG_WR(bp, BNX2_CTX_VIRT_ADDR, vcid_addr); -			REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr); +			BNX2_WR(bp, BNX2_CTX_VIRT_ADDR, vcid_addr); +			BNX2_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);  			/* Zero out the context. */  			for (offset = 0; offset < PHY_CTX_SIZE; offset += 4) @@ -2633,7 +2632,7 @@ bnx2_alloc_bad_rbuf(struct bnx2 *bp)  	if (good_mbuf == NULL)  		return -ENOMEM; -	REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, +	BNX2_WR(bp, BNX2_MISC_ENABLE_SET_BITS,  		BNX2_MISC_ENABLE_SET_BITS_RX_MBUF_ENABLE);  	good_mbuf_cnt = 0; @@ -2678,21 +2677,21 @@ bnx2_set_mac_addr(struct bnx2 *bp, u8 *mac_addr, u32 pos)  	val = (mac_addr[0] << 8) | mac_addr[1]; -	REG_WR(bp, BNX2_EMAC_MAC_MATCH0 + (pos * 8), val); +	BNX2_WR(bp, BNX2_EMAC_MAC_MATCH0 + (pos * 8), val);  	val = (mac_addr[2] << 24) | (mac_addr[3] << 16) |  		(mac_addr[4] << 8) | mac_addr[5]; -	REG_WR(bp, BNX2_EMAC_MAC_MATCH1 + (pos * 8), val); +	BNX2_WR(bp, BNX2_EMAC_MAC_MATCH1 + (pos * 8), val);  }  static inline int  bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp_t gfp)  {  	dma_addr_t mapping; -	struct sw_pg *rx_pg = &rxr->rx_pg_ring[index]; -	struct rx_bd *rxbd = -		&rxr->rx_pg_desc_ring[RX_RING(index)][RX_IDX(index)]; +	struct bnx2_sw_pg *rx_pg = &rxr->rx_pg_ring[index]; +	struct bnx2_rx_bd *rxbd = +		&rxr->rx_pg_desc_ring[BNX2_RX_RING(index)][BNX2_RX_IDX(index)];  	struct page *page = alloc_page(gfp);  	if (!page) @@ -2714,7 +2713,7 @@ bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gf  static void  bnx2_free_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)  { -	struct sw_pg *rx_pg = &rxr->rx_pg_ring[index]; +	struct bnx2_sw_pg *rx_pg = &rxr->rx_pg_ring[index];  	struct page *page = rx_pg->page;  	if (!page) @@ -2731,9 +2730,10 @@ static inline int  bnx2_alloc_rx_data(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp_t gfp)  {  	u8 *data; -	struct sw_bd *rx_buf = &rxr->rx_buf_ring[index]; +	struct bnx2_sw_bd *rx_buf = &rxr->rx_buf_ring[index];  	dma_addr_t mapping; -	struct rx_bd *rxbd = &rxr->rx_desc_ring[RX_RING(index)][RX_IDX(index)]; +	struct bnx2_rx_bd *rxbd = +		&rxr->rx_desc_ring[BNX2_RX_RING(index)][BNX2_RX_IDX(index)];  	data = kmalloc(bp->rx_buf_size, gfp);  	if (!data) @@ -2770,9 +2770,9 @@ bnx2_phy_event_is_set(struct bnx2 *bp, struct bnx2_napi *bnapi, u32 event)  	old_link_state = sblk->status_attn_bits_ack & event;  	if (new_link_state != old_link_state) {  		if (new_link_state) -			REG_WR(bp, BNX2_PCICFG_STATUS_BIT_SET_CMD, event); +			BNX2_WR(bp, BNX2_PCICFG_STATUS_BIT_SET_CMD, event);  		else -			REG_WR(bp, BNX2_PCICFG_STATUS_BIT_CLEAR_CMD, event); +			BNX2_WR(bp, BNX2_PCICFG_STATUS_BIT_CLEAR_CMD, event);  	} else  		is_set = 0; @@ -2802,7 +2802,7 @@ bnx2_get_hw_tx_cons(struct bnx2_napi *bnapi)  	barrier();  	cons = *bnapi->hw_tx_cons_ptr;  	barrier(); -	if (unlikely((cons & MAX_TX_DESC_CNT) == MAX_TX_DESC_CNT)) +	if (unlikely((cons & BNX2_MAX_TX_DESC_CNT) == BNX2_MAX_TX_DESC_CNT))  		cons++;  	return cons;  } @@ -2823,11 +2823,11 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)  	sw_cons = txr->tx_cons;  	while (sw_cons != hw_cons) { -		struct sw_tx_bd *tx_buf; +		struct bnx2_sw_tx_bd *tx_buf;  		struct sk_buff *skb;  		int i, last; -		sw_ring_cons = TX_RING_IDX(sw_cons); +		sw_ring_cons = BNX2_TX_RING_IDX(sw_cons);  		tx_buf = &txr->tx_buf_ring[sw_ring_cons];  		skb = tx_buf->skb; @@ -2841,7 +2841,7 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)  			last_idx = sw_cons + tx_buf->nr_frags + 1;  			last_ring_idx = sw_ring_cons + tx_buf->nr_frags + 1; -			if (unlikely(last_ring_idx >= MAX_TX_DESC_CNT)) { +			if (unlikely(last_ring_idx >= BNX2_MAX_TX_DESC_CNT)) {  				last_idx++;  			}  			if (((s16) ((s16) last_idx - (s16) hw_cons)) > 0) { @@ -2856,17 +2856,18 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)  		last = tx_buf->nr_frags;  		for (i = 0; i < last; i++) { -			sw_cons = NEXT_TX_BD(sw_cons); +			struct bnx2_sw_tx_bd *tx_buf; +			sw_cons = BNX2_NEXT_TX_BD(sw_cons); + +			tx_buf = &txr->tx_buf_ring[BNX2_TX_RING_IDX(sw_cons)];  			dma_unmap_page(&bp->pdev->dev, -				dma_unmap_addr( -					&txr->tx_buf_ring[TX_RING_IDX(sw_cons)], -					mapping), +				dma_unmap_addr(tx_buf, mapping),  				skb_frag_size(&skb_shinfo(skb)->frags[i]),  				PCI_DMA_TODEVICE);  		} -		sw_cons = NEXT_TX_BD(sw_cons); +		sw_cons = BNX2_NEXT_TX_BD(sw_cons);  		tx_bytes += skb->len;  		dev_kfree_skb(skb); @@ -2905,8 +2906,8 @@ static void  bnx2_reuse_rx_skb_pages(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,  			struct sk_buff *skb, int count)  { -	struct sw_pg *cons_rx_pg, *prod_rx_pg; -	struct rx_bd *cons_bd, *prod_bd; +	struct bnx2_sw_pg *cons_rx_pg, *prod_rx_pg; +	struct bnx2_rx_bd *cons_bd, *prod_bd;  	int i;  	u16 hw_prod, prod;  	u16 cons = rxr->rx_pg_cons; @@ -2933,12 +2934,14 @@ bnx2_reuse_rx_skb_pages(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,  	hw_prod = rxr->rx_pg_prod;  	for (i = 0; i < count; i++) { -		prod = RX_PG_RING_IDX(hw_prod); +		prod = BNX2_RX_PG_RING_IDX(hw_prod);  		prod_rx_pg = &rxr->rx_pg_ring[prod];  		cons_rx_pg = &rxr->rx_pg_ring[cons]; -		cons_bd = &rxr->rx_pg_desc_ring[RX_RING(cons)][RX_IDX(cons)]; -		prod_bd = &rxr->rx_pg_desc_ring[RX_RING(prod)][RX_IDX(prod)]; +		cons_bd = &rxr->rx_pg_desc_ring[BNX2_RX_RING(cons)] +						[BNX2_RX_IDX(cons)]; +		prod_bd = &rxr->rx_pg_desc_ring[BNX2_RX_RING(prod)] +						[BNX2_RX_IDX(prod)];  		if (prod != cons) {  			prod_rx_pg->page = cons_rx_pg->page; @@ -2950,8 +2953,8 @@ bnx2_reuse_rx_skb_pages(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,  			prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo;  		} -		cons = RX_PG_RING_IDX(NEXT_RX_BD(cons)); -		hw_prod = NEXT_RX_BD(hw_prod); +		cons = BNX2_RX_PG_RING_IDX(BNX2_NEXT_RX_BD(cons)); +		hw_prod = BNX2_NEXT_RX_BD(hw_prod);  	}  	rxr->rx_pg_prod = hw_prod;  	rxr->rx_pg_cons = cons; @@ -2961,8 +2964,8 @@ static inline void  bnx2_reuse_rx_data(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,  		   u8 *data, u16 cons, u16 prod)  { -	struct sw_bd *cons_rx_buf, *prod_rx_buf; -	struct rx_bd *cons_bd, *prod_bd; +	struct bnx2_sw_bd *cons_rx_buf, *prod_rx_buf; +	struct bnx2_rx_bd *cons_bd, *prod_bd;  	cons_rx_buf = &rxr->rx_buf_ring[cons];  	prod_rx_buf = &rxr->rx_buf_ring[prod]; @@ -2981,8 +2984,8 @@ bnx2_reuse_rx_data(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,  	dma_unmap_addr_set(prod_rx_buf, mapping,  			dma_unmap_addr(cons_rx_buf, mapping)); -	cons_bd = &rxr->rx_desc_ring[RX_RING(cons)][RX_IDX(cons)]; -	prod_bd = &rxr->rx_desc_ring[RX_RING(prod)][RX_IDX(prod)]; +	cons_bd = &rxr->rx_desc_ring[BNX2_RX_RING(cons)][BNX2_RX_IDX(cons)]; +	prod_bd = &rxr->rx_desc_ring[BNX2_RX_RING(prod)][BNX2_RX_IDX(prod)];  	prod_bd->rx_bd_haddr_hi = cons_bd->rx_bd_haddr_hi;  	prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo;  } @@ -3022,7 +3025,7 @@ error:  		return skb;  	} else {  		unsigned int i, frag_len, frag_size, pages; -		struct sw_pg *rx_pg; +		struct bnx2_sw_pg *rx_pg;  		u16 pg_cons = rxr->rx_pg_cons;  		u16 pg_prod = rxr->rx_pg_prod; @@ -3065,7 +3068,7 @@ error:  			rx_pg->page = NULL;  			err = bnx2_alloc_rx_page(bp, rxr, -						 RX_PG_RING_IDX(pg_prod), +						 BNX2_RX_PG_RING_IDX(pg_prod),  						 GFP_ATOMIC);  			if (unlikely(err)) {  				rxr->rx_pg_cons = pg_cons; @@ -3083,8 +3086,8 @@ error:  			skb->truesize += PAGE_SIZE;  			skb->len += frag_len; -			pg_prod = NEXT_RX_BD(pg_prod); -			pg_cons = RX_PG_RING_IDX(NEXT_RX_BD(pg_cons)); +			pg_prod = BNX2_NEXT_RX_BD(pg_prod); +			pg_cons = BNX2_RX_PG_RING_IDX(BNX2_NEXT_RX_BD(pg_cons));  		}  		rxr->rx_pg_prod = pg_prod;  		rxr->rx_pg_cons = pg_cons; @@ -3101,7 +3104,7 @@ bnx2_get_hw_rx_cons(struct bnx2_napi *bnapi)  	barrier();  	cons = *bnapi->hw_rx_cons_ptr;  	barrier(); -	if (unlikely((cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT)) +	if (unlikely((cons & BNX2_MAX_RX_DESC_CNT) == BNX2_MAX_RX_DESC_CNT))  		cons++;  	return cons;  } @@ -3125,13 +3128,14 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)  	while (sw_cons != hw_cons) {  		unsigned int len, hdr_len;  		u32 status; -		struct sw_bd *rx_buf, *next_rx_buf; +		struct bnx2_sw_bd *rx_buf, *next_rx_buf;  		struct sk_buff *skb;  		dma_addr_t dma_addr;  		u8 *data; +		u16 next_ring_idx; -		sw_ring_cons = RX_RING_IDX(sw_cons); -		sw_ring_prod = RX_RING_IDX(sw_prod); +		sw_ring_cons = BNX2_RX_RING_IDX(sw_cons); +		sw_ring_prod = BNX2_RX_RING_IDX(sw_prod);  		rx_buf = &rxr->rx_buf_ring[sw_ring_cons];  		data = rx_buf->data; @@ -3146,8 +3150,8 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)  			BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH,  			PCI_DMA_FROMDEVICE); -		next_rx_buf = -			&rxr->rx_buf_ring[RX_RING_IDX(NEXT_RX_BD(sw_cons))]; +		next_ring_idx = BNX2_RX_RING_IDX(BNX2_NEXT_RX_BD(sw_cons)); +		next_rx_buf = &rxr->rx_buf_ring[next_ring_idx];  		prefetch(get_l2_fhdr(next_rx_buf->data));  		len = rx_hdr->l2_fhdr_pkt_len; @@ -3239,8 +3243,8 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)  		rx_pkt++;  next_rx: -		sw_cons = NEXT_RX_BD(sw_cons); -		sw_prod = NEXT_RX_BD(sw_prod); +		sw_cons = BNX2_NEXT_RX_BD(sw_cons); +		sw_prod = BNX2_NEXT_RX_BD(sw_prod);  		if ((rx_pkt == budget))  			break; @@ -3255,11 +3259,11 @@ next_rx:  	rxr->rx_prod = sw_prod;  	if (pg_ring_used) -		REG_WR16(bp, rxr->rx_pg_bidx_addr, rxr->rx_pg_prod); +		BNX2_WR16(bp, rxr->rx_pg_bidx_addr, rxr->rx_pg_prod); -	REG_WR16(bp, rxr->rx_bidx_addr, sw_prod); +	BNX2_WR16(bp, rxr->rx_bidx_addr, sw_prod); -	REG_WR(bp, rxr->rx_bseq_addr, rxr->rx_prod_bseq); +	BNX2_WR(bp, rxr->rx_bseq_addr, rxr->rx_prod_bseq);  	mmiowb(); @@ -3277,7 +3281,7 @@ bnx2_msi(int irq, void *dev_instance)  	struct bnx2 *bp = bnapi->bp;  	prefetch(bnapi->status_blk.msi); -	REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, +	BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD,  		BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |  		BNX2_PCICFG_INT_ACK_CMD_MASK_INT); @@ -3321,18 +3325,18 @@ bnx2_interrupt(int irq, void *dev_instance)  	 * the status block write.  	 */  	if ((sblk->status_idx == bnapi->last_status_idx) && -	    (REG_RD(bp, BNX2_PCICFG_MISC_STATUS) & +	    (BNX2_RD(bp, BNX2_PCICFG_MISC_STATUS) &  	     BNX2_PCICFG_MISC_STATUS_INTA_VALUE))  		return IRQ_NONE; -	REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, +	BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD,  		BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |  		BNX2_PCICFG_INT_ACK_CMD_MASK_INT);  	/* Read back to deassert IRQ immediately to avoid too many  	 * spurious interrupts.  	 */ -	REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD); +	BNX2_RD(bp, BNX2_PCICFG_INT_ACK_CMD);  	/* Return here if interrupt is shared and is disabled. */  	if (unlikely(atomic_read(&bp->intr_sem) != 0)) @@ -3388,14 +3392,14 @@ bnx2_chk_missed_msi(struct bnx2 *bp)  	u32 msi_ctrl;  	if (bnx2_has_work(bnapi)) { -		msi_ctrl = REG_RD(bp, BNX2_PCICFG_MSI_CONTROL); +		msi_ctrl = BNX2_RD(bp, BNX2_PCICFG_MSI_CONTROL);  		if (!(msi_ctrl & BNX2_PCICFG_MSI_CONTROL_ENABLE))  			return;  		if (bnapi->last_status_idx == bp->idle_chk_status_idx) { -			REG_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl & -			       ~BNX2_PCICFG_MSI_CONTROL_ENABLE); -			REG_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl); +			BNX2_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl & +				~BNX2_PCICFG_MSI_CONTROL_ENABLE); +			BNX2_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl);  			bnx2_msi(bp->irq_tbl[0].vector, bnapi);  		}  	} @@ -3434,9 +3438,9 @@ static void bnx2_poll_link(struct bnx2 *bp, struct bnx2_napi *bnapi)  		/* This is needed to take care of transient status  		 * during link changes.  		 */ -		REG_WR(bp, BNX2_HC_COMMAND, -		       bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); -		REG_RD(bp, BNX2_HC_COMMAND); +		BNX2_WR(bp, BNX2_HC_COMMAND, +			bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); +		BNX2_RD(bp, BNX2_HC_COMMAND);  	}  } @@ -3473,9 +3477,9 @@ static int bnx2_poll_msix(struct napi_struct *napi, int budget)  		if (likely(!bnx2_has_fast_work(bnapi))) {  			napi_complete(napi); -			REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num | -			       BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | -			       bnapi->last_status_idx); +			BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num | +				BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | +				bnapi->last_status_idx);  			break;  		}  	} @@ -3511,19 +3515,19 @@ static int bnx2_poll(struct napi_struct *napi, int budget)  		if (likely(!bnx2_has_work(bnapi))) {  			napi_complete(napi);  			if (likely(bp->flags & BNX2_FLAG_USING_MSI_OR_MSIX)) { -				REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, -				       BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | -				       bnapi->last_status_idx); +				BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, +					BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | +					bnapi->last_status_idx);  				break;  			} -			REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, -			       BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | -			       BNX2_PCICFG_INT_ACK_CMD_MASK_INT | -			       bnapi->last_status_idx); - -			REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, -			       BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | -			       bnapi->last_status_idx); +			BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, +				BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | +				BNX2_PCICFG_INT_ACK_CMD_MASK_INT | +				bnapi->last_status_idx); + +			BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, +				BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | +				bnapi->last_status_idx);  			break;  		}  	} @@ -3561,8 +3565,8 @@ bnx2_set_rx_mode(struct net_device *dev)  	}  	else if (dev->flags & IFF_ALLMULTI) {  		for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) { -			REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4), -			       0xffffffff); +			BNX2_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4), +				0xffffffff);          	}  		sort_mode |= BNX2_RPM_SORT_USER0_MC_EN;  	} @@ -3584,8 +3588,8 @@ bnx2_set_rx_mode(struct net_device *dev)  		}  		for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) { -			REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4), -			       mc_filter[i]); +			BNX2_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4), +				mc_filter[i]);  		}  		sort_mode |= BNX2_RPM_SORT_USER0_MC_HSH_EN; @@ -3610,12 +3614,12 @@ bnx2_set_rx_mode(struct net_device *dev)  	if (rx_mode != bp->rx_mode) {  		bp->rx_mode = rx_mode; -		REG_WR(bp, BNX2_EMAC_RX_MODE, rx_mode); +		BNX2_WR(bp, BNX2_EMAC_RX_MODE, rx_mode);  	} -	REG_WR(bp, BNX2_RPM_SORT_USER0, 0x0); -	REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode); -	REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode | BNX2_RPM_SORT_USER0_ENA); +	BNX2_WR(bp, BNX2_RPM_SORT_USER0, 0x0); +	BNX2_WR(bp, BNX2_RPM_SORT_USER0, sort_mode); +	BNX2_WR(bp, BNX2_RPM_SORT_USER0, sort_mode | BNX2_RPM_SORT_USER0_ENA);  	spin_unlock_bh(&bp->phy_lock);  } @@ -3663,10 +3667,10 @@ static int bnx2_request_uncached_firmware(struct bnx2 *bp)  	const struct bnx2_rv2p_fw_file *rv2p_fw;  	int rc; -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {  		mips_fw_file = FW_MIPS_FILE_09; -		if ((CHIP_ID(bp) == CHIP_ID_5709_A0) || -		    (CHIP_ID(bp) == CHIP_ID_5709_A1)) +		if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5709_A0) || +		    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5709_A1))  			rv2p_fw_file = FW_RV2P_FILE_09_Ax;  		else  			rv2p_fw_file = FW_RV2P_FILE_09; @@ -3756,13 +3760,13 @@ load_rv2p_fw(struct bnx2 *bp, u32 rv2p_proc,  	}  	for (i = 0; i < rv2p_code_len; i += 8) { -		REG_WR(bp, BNX2_RV2P_INSTR_HIGH, be32_to_cpu(*rv2p_code)); +		BNX2_WR(bp, BNX2_RV2P_INSTR_HIGH, be32_to_cpu(*rv2p_code));  		rv2p_code++; -		REG_WR(bp, BNX2_RV2P_INSTR_LOW, be32_to_cpu(*rv2p_code)); +		BNX2_WR(bp, BNX2_RV2P_INSTR_LOW, be32_to_cpu(*rv2p_code));  		rv2p_code++;  		val = (i / 8) | cmd; -		REG_WR(bp, addr, val); +		BNX2_WR(bp, addr, val);  	}  	rv2p_code = (__be32 *)(bp->rv2p_firmware->data + file_offset); @@ -3772,22 +3776,22 @@ load_rv2p_fw(struct bnx2 *bp, u32 rv2p_proc,  		loc = be32_to_cpu(fw_entry->fixup[i]);  		if (loc && ((loc * 4) < rv2p_code_len)) {  			code = be32_to_cpu(*(rv2p_code + loc - 1)); -			REG_WR(bp, BNX2_RV2P_INSTR_HIGH, code); +			BNX2_WR(bp, BNX2_RV2P_INSTR_HIGH, code);  			code = be32_to_cpu(*(rv2p_code + loc));  			code = rv2p_fw_fixup(rv2p_proc, i, loc, code); -			REG_WR(bp, BNX2_RV2P_INSTR_LOW, code); +			BNX2_WR(bp, BNX2_RV2P_INSTR_LOW, code);  			val = (loc / 2) | cmd; -			REG_WR(bp, addr, val); +			BNX2_WR(bp, addr, val);  		}  	}  	/* Reset the processor, un-stall is done later. */  	if (rv2p_proc == RV2P_PROC1) { -		REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC1_RESET); +		BNX2_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC1_RESET);  	}  	else { -		REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC2_RESET); +		BNX2_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC2_RESET);  	}  	return 0; @@ -3924,14 +3928,14 @@ bnx2_set_power_state(struct bnx2 *bp, pci_power_t state)  			/* delay required during transition out of D3hot */  			msleep(20); -		val = REG_RD(bp, BNX2_EMAC_MODE); +		val = BNX2_RD(bp, BNX2_EMAC_MODE);  		val |= BNX2_EMAC_MODE_MPKT_RCVD | BNX2_EMAC_MODE_ACPI_RCVD;  		val &= ~BNX2_EMAC_MODE_MPKT; -		REG_WR(bp, BNX2_EMAC_MODE, val); +		BNX2_WR(bp, BNX2_EMAC_MODE, val); -		val = REG_RD(bp, BNX2_RPM_CONFIG); +		val = BNX2_RD(bp, BNX2_RPM_CONFIG);  		val &= ~BNX2_RPM_CONFIG_ACPI_ENA; -		REG_WR(bp, BNX2_RPM_CONFIG, val); +		BNX2_WR(bp, BNX2_RPM_CONFIG, val);  		break;  	}  	case PCI_D3hot: { @@ -3963,7 +3967,7 @@ bnx2_set_power_state(struct bnx2 *bp, pci_power_t state)  			bnx2_set_mac_addr(bp, bp->dev->dev_addr, 0); -			val = REG_RD(bp, BNX2_EMAC_MODE); +			val = BNX2_RD(bp, BNX2_EMAC_MODE);  			/* Enable port mode. */  			val &= ~BNX2_EMAC_MODE_PORT; @@ -3978,32 +3982,32 @@ bnx2_set_power_state(struct bnx2 *bp, pci_power_t state)  					val |= BNX2_EMAC_MODE_25G_MODE;  			} -			REG_WR(bp, BNX2_EMAC_MODE, val); +			BNX2_WR(bp, BNX2_EMAC_MODE, val);  			/* receive all multicast */  			for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) { -				REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4), -				       0xffffffff); +				BNX2_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4), +					0xffffffff);  			} -			REG_WR(bp, BNX2_EMAC_RX_MODE, -			       BNX2_EMAC_RX_MODE_SORT_MODE); +			BNX2_WR(bp, BNX2_EMAC_RX_MODE, +				BNX2_EMAC_RX_MODE_SORT_MODE);  			val = 1 | BNX2_RPM_SORT_USER0_BC_EN |  			      BNX2_RPM_SORT_USER0_MC_EN; -			REG_WR(bp, BNX2_RPM_SORT_USER0, 0x0); -			REG_WR(bp, BNX2_RPM_SORT_USER0, val); -			REG_WR(bp, BNX2_RPM_SORT_USER0, val | -			       BNX2_RPM_SORT_USER0_ENA); +			BNX2_WR(bp, BNX2_RPM_SORT_USER0, 0x0); +			BNX2_WR(bp, BNX2_RPM_SORT_USER0, val); +			BNX2_WR(bp, BNX2_RPM_SORT_USER0, val | +				BNX2_RPM_SORT_USER0_ENA);  			/* Need to enable EMAC and RPM for WOL. */ -			REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, -			       BNX2_MISC_ENABLE_SET_BITS_RX_PARSER_MAC_ENABLE | -			       BNX2_MISC_ENABLE_SET_BITS_TX_HEADER_Q_ENABLE | -			       BNX2_MISC_ENABLE_SET_BITS_EMAC_ENABLE); +			BNX2_WR(bp, BNX2_MISC_ENABLE_SET_BITS, +				BNX2_MISC_ENABLE_SET_BITS_RX_PARSER_MAC_ENABLE | +				BNX2_MISC_ENABLE_SET_BITS_TX_HEADER_Q_ENABLE | +				BNX2_MISC_ENABLE_SET_BITS_EMAC_ENABLE); -			val = REG_RD(bp, BNX2_RPM_CONFIG); +			val = BNX2_RD(bp, BNX2_RPM_CONFIG);  			val &= ~BNX2_RPM_CONFIG_ACPI_ENA; -			REG_WR(bp, BNX2_RPM_CONFIG, val); +			BNX2_WR(bp, BNX2_RPM_CONFIG, val);  			wol_msg = BNX2_DRV_MSG_CODE_SUSPEND_WOL;  		} @@ -4016,8 +4020,8 @@ bnx2_set_power_state(struct bnx2 *bp, pci_power_t state)  				     1, 0);  		pmcsr &= ~PCI_PM_CTRL_STATE_MASK; -		if ((CHIP_ID(bp) == CHIP_ID_5706_A0) || -		    (CHIP_ID(bp) == CHIP_ID_5706_A1)) { +		if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) || +		    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A1)) {  			if (bp->wol)  				pmcsr |= 3; @@ -4050,9 +4054,9 @@ bnx2_acquire_nvram_lock(struct bnx2 *bp)  	int j;  	/* Request access to the flash interface. */ -	REG_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_SET2); +	BNX2_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_SET2);  	for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { -		val = REG_RD(bp, BNX2_NVM_SW_ARB); +		val = BNX2_RD(bp, BNX2_NVM_SW_ARB);  		if (val & BNX2_NVM_SW_ARB_ARB_ARB2)  			break; @@ -4072,10 +4076,10 @@ bnx2_release_nvram_lock(struct bnx2 *bp)  	u32 val;  	/* Relinquish nvram interface. */ -	REG_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_CLR2); +	BNX2_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_CLR2);  	for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { -		val = REG_RD(bp, BNX2_NVM_SW_ARB); +		val = BNX2_RD(bp, BNX2_NVM_SW_ARB);  		if (!(val & BNX2_NVM_SW_ARB_ARB_ARB2))  			break; @@ -4094,20 +4098,20 @@ bnx2_enable_nvram_write(struct bnx2 *bp)  {  	u32 val; -	val = REG_RD(bp, BNX2_MISC_CFG); -	REG_WR(bp, BNX2_MISC_CFG, val | BNX2_MISC_CFG_NVM_WR_EN_PCI); +	val = BNX2_RD(bp, BNX2_MISC_CFG); +	BNX2_WR(bp, BNX2_MISC_CFG, val | BNX2_MISC_CFG_NVM_WR_EN_PCI);  	if (bp->flash_info->flags & BNX2_NV_WREN) {  		int j; -		REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE); -		REG_WR(bp, BNX2_NVM_COMMAND, -		       BNX2_NVM_COMMAND_WREN | BNX2_NVM_COMMAND_DOIT); +		BNX2_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE); +		BNX2_WR(bp, BNX2_NVM_COMMAND, +			BNX2_NVM_COMMAND_WREN | BNX2_NVM_COMMAND_DOIT);  		for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {  			udelay(5); -			val = REG_RD(bp, BNX2_NVM_COMMAND); +			val = BNX2_RD(bp, BNX2_NVM_COMMAND);  			if (val & BNX2_NVM_COMMAND_DONE)  				break;  		} @@ -4123,8 +4127,8 @@ bnx2_disable_nvram_write(struct bnx2 *bp)  {  	u32 val; -	val = REG_RD(bp, BNX2_MISC_CFG); -	REG_WR(bp, BNX2_MISC_CFG, val & ~BNX2_MISC_CFG_NVM_WR_EN); +	val = BNX2_RD(bp, BNX2_MISC_CFG); +	BNX2_WR(bp, BNX2_MISC_CFG, val & ~BNX2_MISC_CFG_NVM_WR_EN);  } @@ -4133,10 +4137,10 @@ bnx2_enable_nvram_access(struct bnx2 *bp)  {  	u32 val; -	val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE); +	val = BNX2_RD(bp, BNX2_NVM_ACCESS_ENABLE);  	/* Enable both bits, even on read. */ -	REG_WR(bp, BNX2_NVM_ACCESS_ENABLE, -	       val | BNX2_NVM_ACCESS_ENABLE_EN | BNX2_NVM_ACCESS_ENABLE_WR_EN); +	BNX2_WR(bp, BNX2_NVM_ACCESS_ENABLE, +		val | BNX2_NVM_ACCESS_ENABLE_EN | BNX2_NVM_ACCESS_ENABLE_WR_EN);  }  static void @@ -4144,9 +4148,9 @@ bnx2_disable_nvram_access(struct bnx2 *bp)  {  	u32 val; -	val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE); +	val = BNX2_RD(bp, BNX2_NVM_ACCESS_ENABLE);  	/* Disable both bits, even after read. */ -	REG_WR(bp, BNX2_NVM_ACCESS_ENABLE, +	BNX2_WR(bp, BNX2_NVM_ACCESS_ENABLE,  		val & ~(BNX2_NVM_ACCESS_ENABLE_EN |  			BNX2_NVM_ACCESS_ENABLE_WR_EN));  } @@ -4166,13 +4170,13 @@ bnx2_nvram_erase_page(struct bnx2 *bp, u32 offset)  	      BNX2_NVM_COMMAND_DOIT;  	/* Need to clear DONE bit separately. */ -	REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE); +	BNX2_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);  	/* Address of the NVRAM to read from. */ -	REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE); +	BNX2_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);  	/* Issue an erase command. */ -	REG_WR(bp, BNX2_NVM_COMMAND, cmd); +	BNX2_WR(bp, BNX2_NVM_COMMAND, cmd);  	/* Wait for completion. */  	for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { @@ -4180,7 +4184,7 @@ bnx2_nvram_erase_page(struct bnx2 *bp, u32 offset)  		udelay(5); -		val = REG_RD(bp, BNX2_NVM_COMMAND); +		val = BNX2_RD(bp, BNX2_NVM_COMMAND);  		if (val & BNX2_NVM_COMMAND_DONE)  			break;  	} @@ -4208,13 +4212,13 @@ bnx2_nvram_read_dword(struct bnx2 *bp, u32 offset, u8 *ret_val, u32 cmd_flags)  	}  	/* Need to clear DONE bit separately. */ -	REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE); +	BNX2_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);  	/* Address of the NVRAM to read from. */ -	REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE); +	BNX2_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);  	/* Issue a read command. */ -	REG_WR(bp, BNX2_NVM_COMMAND, cmd); +	BNX2_WR(bp, BNX2_NVM_COMMAND, cmd);  	/* Wait for completion. */  	for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { @@ -4222,9 +4226,9 @@ bnx2_nvram_read_dword(struct bnx2 *bp, u32 offset, u8 *ret_val, u32 cmd_flags)  		udelay(5); -		val = REG_RD(bp, BNX2_NVM_COMMAND); +		val = BNX2_RD(bp, BNX2_NVM_COMMAND);  		if (val & BNX2_NVM_COMMAND_DONE) { -			__be32 v = cpu_to_be32(REG_RD(bp, BNX2_NVM_READ)); +			__be32 v = cpu_to_be32(BNX2_RD(bp, BNX2_NVM_READ));  			memcpy(ret_val, &v, 4);  			break;  		} @@ -4254,24 +4258,24 @@ bnx2_nvram_write_dword(struct bnx2 *bp, u32 offset, u8 *val, u32 cmd_flags)  	}  	/* Need to clear DONE bit separately. */ -	REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE); +	BNX2_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);  	memcpy(&val32, val, 4);  	/* Write the data. */ -	REG_WR(bp, BNX2_NVM_WRITE, be32_to_cpu(val32)); +	BNX2_WR(bp, BNX2_NVM_WRITE, be32_to_cpu(val32));  	/* Address of the NVRAM to write to. */ -	REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE); +	BNX2_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);  	/* Issue the write command. */ -	REG_WR(bp, BNX2_NVM_COMMAND, cmd); +	BNX2_WR(bp, BNX2_NVM_COMMAND, cmd);  	/* Wait for completion. */  	for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {  		udelay(5); -		if (REG_RD(bp, BNX2_NVM_COMMAND) & BNX2_NVM_COMMAND_DONE) +		if (BNX2_RD(bp, BNX2_NVM_COMMAND) & BNX2_NVM_COMMAND_DONE)  			break;  	}  	if (j >= NVRAM_TIMEOUT_COUNT) @@ -4287,13 +4291,13 @@ bnx2_init_nvram(struct bnx2 *bp)  	int j, entry_count, rc = 0;  	const struct flash_spec *flash; -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {  		bp->flash_info = &flash_5709;  		goto get_flash_size;  	}  	/* Determine the selected interface. */ -	val = REG_RD(bp, BNX2_NVM_CFG1); +	val = BNX2_RD(bp, BNX2_NVM_CFG1);  	entry_count = ARRAY_SIZE(flash_table); @@ -4332,10 +4336,10 @@ bnx2_init_nvram(struct bnx2 *bp)  				bnx2_enable_nvram_access(bp);  				/* Reconfigure the flash interface */ -				REG_WR(bp, BNX2_NVM_CFG1, flash->config1); -				REG_WR(bp, BNX2_NVM_CFG2, flash->config2); -				REG_WR(bp, BNX2_NVM_CFG3, flash->config3); -				REG_WR(bp, BNX2_NVM_WRITE1, flash->write1); +				BNX2_WR(bp, BNX2_NVM_CFG1, flash->config1); +				BNX2_WR(bp, BNX2_NVM_CFG2, flash->config2); +				BNX2_WR(bp, BNX2_NVM_CFG3, flash->config3); +				BNX2_WR(bp, BNX2_NVM_WRITE1, flash->write1);  				/* Disable access to flash interface */  				bnx2_disable_nvram_access(bp); @@ -4696,10 +4700,10 @@ bnx2_init_fw_cap(struct bnx2 *bp)  static void  bnx2_setup_msix_tbl(struct bnx2 *bp)  { -	REG_WR(bp, BNX2_PCI_GRC_WINDOW_ADDR, BNX2_PCI_GRC_WINDOW_ADDR_SEP_WIN); +	BNX2_WR(bp, BNX2_PCI_GRC_WINDOW_ADDR, BNX2_PCI_GRC_WINDOW_ADDR_SEP_WIN); -	REG_WR(bp, BNX2_PCI_GRC_WINDOW2_ADDR, BNX2_MSIX_TABLE_ADDR); -	REG_WR(bp, BNX2_PCI_GRC_WINDOW3_ADDR, BNX2_MSIX_PBA_ADDR); +	BNX2_WR(bp, BNX2_PCI_GRC_WINDOW2_ADDR, BNX2_MSIX_TABLE_ADDR); +	BNX2_WR(bp, BNX2_PCI_GRC_WINDOW3_ADDR, BNX2_MSIX_PBA_ADDR);  }  static int @@ -4711,24 +4715,24 @@ bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)  	/* Wait for the current PCI transaction to complete before  	 * issuing a reset. */ -	if ((CHIP_NUM(bp) == CHIP_NUM_5706) || -	    (CHIP_NUM(bp) == CHIP_NUM_5708)) { -		REG_WR(bp, BNX2_MISC_ENABLE_CLR_BITS, -		       BNX2_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE | -		       BNX2_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE | -		       BNX2_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE | -		       BNX2_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE); -		val = REG_RD(bp, BNX2_MISC_ENABLE_CLR_BITS); +	if ((BNX2_CHIP(bp) == BNX2_CHIP_5706) || +	    (BNX2_CHIP(bp) == BNX2_CHIP_5708)) { +		BNX2_WR(bp, BNX2_MISC_ENABLE_CLR_BITS, +			BNX2_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE | +			BNX2_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE | +			BNX2_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE | +			BNX2_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE); +		val = BNX2_RD(bp, BNX2_MISC_ENABLE_CLR_BITS);  		udelay(5);  	} else {  /* 5709 */ -		val = REG_RD(bp, BNX2_MISC_NEW_CORE_CTL); +		val = BNX2_RD(bp, BNX2_MISC_NEW_CORE_CTL);  		val &= ~BNX2_MISC_NEW_CORE_CTL_DMA_ENABLE; -		REG_WR(bp, BNX2_MISC_NEW_CORE_CTL, val); -		val = REG_RD(bp, BNX2_MISC_NEW_CORE_CTL); +		BNX2_WR(bp, BNX2_MISC_NEW_CORE_CTL, val); +		val = BNX2_RD(bp, BNX2_MISC_NEW_CORE_CTL);  		for (i = 0; i < 100; i++) {  			msleep(1); -			val = REG_RD(bp, BNX2_PCICFG_DEVICE_CONTROL); +			val = BNX2_RD(bp, BNX2_PCICFG_DEVICE_CONTROL);  			if (!(val & BNX2_PCICFG_DEVICE_STATUS_NO_PEND))  				break;  		} @@ -4744,17 +4748,17 @@ bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)  	/* Do a dummy read to force the chip to complete all current transaction  	 * before we issue a reset. */ -	val = REG_RD(bp, BNX2_MISC_ID); +	val = BNX2_RD(bp, BNX2_MISC_ID); -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { -		REG_WR(bp, BNX2_MISC_COMMAND, BNX2_MISC_COMMAND_SW_RESET); -		REG_RD(bp, BNX2_MISC_COMMAND); +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) { +		BNX2_WR(bp, BNX2_MISC_COMMAND, BNX2_MISC_COMMAND_SW_RESET); +		BNX2_RD(bp, BNX2_MISC_COMMAND);  		udelay(5);  		val = BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |  		      BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP; -		REG_WR(bp, BNX2_PCICFG_MISC_CONFIG, val); +		BNX2_WR(bp, BNX2_PCICFG_MISC_CONFIG, val);  	} else {  		val = BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ | @@ -4762,19 +4766,19 @@ bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)  		      BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP;  		/* Chip reset. */ -		REG_WR(bp, BNX2_PCICFG_MISC_CONFIG, val); +		BNX2_WR(bp, BNX2_PCICFG_MISC_CONFIG, val);  		/* Reading back any register after chip reset will hang the  		 * bus on 5706 A0 and A1.  The msleep below provides plenty  		 * of margin for write posting.  		 */ -		if ((CHIP_ID(bp) == CHIP_ID_5706_A0) || -		    (CHIP_ID(bp) == CHIP_ID_5706_A1)) +		if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) || +		    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A1))  			msleep(20);  		/* Reset takes approximate 30 usec */  		for (i = 0; i < 10; i++) { -			val = REG_RD(bp, BNX2_PCICFG_MISC_CONFIG); +			val = BNX2_RD(bp, BNX2_PCICFG_MISC_CONFIG);  			if ((val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |  				    BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) == 0)  				break; @@ -4789,7 +4793,7 @@ bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)  	}  	/* Make sure byte swapping is properly configured. */ -	val = REG_RD(bp, BNX2_PCI_SWAP_DIAG0); +	val = BNX2_RD(bp, BNX2_PCI_SWAP_DIAG0);  	if (val != 0x01020304) {  		pr_err("Chip not in correct endian mode\n");  		return -ENODEV; @@ -4808,10 +4812,10 @@ bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)  		bnx2_set_default_remote_link(bp);  	spin_unlock_bh(&bp->phy_lock); -	if (CHIP_ID(bp) == CHIP_ID_5706_A0) { +	if (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) {  		/* Adjust the voltage regular to two steps lower.  The default  		 * of this register is 0x0000000e. */ -		REG_WR(bp, BNX2_MISC_VREG_CONTROL, 0x000000fa); +		BNX2_WR(bp, BNX2_MISC_VREG_CONTROL, 0x000000fa);  		/* Remove bad rbuf memory from the free pool. */  		rc = bnx2_alloc_bad_rbuf(bp); @@ -4820,7 +4824,7 @@ bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)  	if (bp->flags & BNX2_FLAG_USING_MSIX) {  		bnx2_setup_msix_tbl(bp);  		/* Prevent MSIX table reads and write from timing out */ -		REG_WR(bp, BNX2_MISC_ECO_HW_CTL, +		BNX2_WR(bp, BNX2_MISC_ECO_HW_CTL,  			BNX2_MISC_ECO_HW_CTL_LARGE_GRC_TMOUT_EN);  	} @@ -4834,7 +4838,7 @@ bnx2_init_chip(struct bnx2 *bp)  	int rc, i;  	/* Make sure the interrupt is not active. */ -	REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, BNX2_PCICFG_INT_ACK_CMD_MASK_INT); +	BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, BNX2_PCICFG_INT_ACK_CMD_MASK_INT);  	val = BNX2_DMA_CONFIG_DATA_BYTE_SWAP |  	      BNX2_DMA_CONFIG_DATA_WORD_SWAP | @@ -4850,16 +4854,17 @@ bnx2_init_chip(struct bnx2 *bp)  	if ((bp->flags & BNX2_FLAG_PCIX) && (bp->bus_speed_mhz == 133))  		val |= (1 << 23); -	if ((CHIP_NUM(bp) == CHIP_NUM_5706) && -	    (CHIP_ID(bp) != CHIP_ID_5706_A0) && !(bp->flags & BNX2_FLAG_PCIX)) +	if ((BNX2_CHIP(bp) == BNX2_CHIP_5706) && +	    (BNX2_CHIP_ID(bp) != BNX2_CHIP_ID_5706_A0) && +	    !(bp->flags & BNX2_FLAG_PCIX))  		val |= BNX2_DMA_CONFIG_CNTL_PING_PONG_DMA; -	REG_WR(bp, BNX2_DMA_CONFIG, val); +	BNX2_WR(bp, BNX2_DMA_CONFIG, val); -	if (CHIP_ID(bp) == CHIP_ID_5706_A0) { -		val = REG_RD(bp, BNX2_TDMA_CONFIG); +	if (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) { +		val = BNX2_RD(bp, BNX2_TDMA_CONFIG);  		val |= BNX2_TDMA_CONFIG_ONE_DMA; -		REG_WR(bp, BNX2_TDMA_CONFIG, val); +		BNX2_WR(bp, BNX2_TDMA_CONFIG, val);  	}  	if (bp->flags & BNX2_FLAG_PCIX) { @@ -4871,14 +4876,14 @@ bnx2_init_chip(struct bnx2 *bp)  				      val16 & ~PCI_X_CMD_ERO);  	} -	REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, -	       BNX2_MISC_ENABLE_SET_BITS_HOST_COALESCE_ENABLE | -	       BNX2_MISC_ENABLE_STATUS_BITS_RX_V2P_ENABLE | -	       BNX2_MISC_ENABLE_STATUS_BITS_CONTEXT_ENABLE); +	BNX2_WR(bp, BNX2_MISC_ENABLE_SET_BITS, +		BNX2_MISC_ENABLE_SET_BITS_HOST_COALESCE_ENABLE | +		BNX2_MISC_ENABLE_STATUS_BITS_RX_V2P_ENABLE | +		BNX2_MISC_ENABLE_STATUS_BITS_CONTEXT_ENABLE);  	/* Initialize context mapping and zero out the quick contexts.  The  	 * context block must have already been enabled. */ -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {  		rc = bnx2_init_5709_context(bp);  		if (rc)  			return rc; @@ -4892,29 +4897,29 @@ bnx2_init_chip(struct bnx2 *bp)  	bnx2_set_mac_addr(bp, bp->dev->dev_addr, 0); -	val = REG_RD(bp, BNX2_MQ_CONFIG); +	val = BNX2_RD(bp, BNX2_MQ_CONFIG);  	val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE;  	val |= BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_256; -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {  		val |= BNX2_MQ_CONFIG_BIN_MQ_MODE; -		if (CHIP_REV(bp) == CHIP_REV_Ax) +		if (BNX2_CHIP_REV(bp) == BNX2_CHIP_REV_Ax)  			val |= BNX2_MQ_CONFIG_HALT_DIS;  	} -	REG_WR(bp, BNX2_MQ_CONFIG, val); +	BNX2_WR(bp, BNX2_MQ_CONFIG, val);  	val = 0x10000 + (MAX_CID_CNT * MB_KERNEL_CTX_SIZE); -	REG_WR(bp, BNX2_MQ_KNL_BYP_WIND_START, val); -	REG_WR(bp, BNX2_MQ_KNL_WIND_END, val); +	BNX2_WR(bp, BNX2_MQ_KNL_BYP_WIND_START, val); +	BNX2_WR(bp, BNX2_MQ_KNL_WIND_END, val); -	val = (BCM_PAGE_BITS - 8) << 24; -	REG_WR(bp, BNX2_RV2P_CONFIG, val); +	val = (BNX2_PAGE_BITS - 8) << 24; +	BNX2_WR(bp, BNX2_RV2P_CONFIG, val);  	/* Configure page size. */ -	val = REG_RD(bp, BNX2_TBDR_CONFIG); +	val = BNX2_RD(bp, BNX2_TBDR_CONFIG);  	val &= ~BNX2_TBDR_CONFIG_PAGE_SIZE; -	val |= (BCM_PAGE_BITS - 8) << 24 | 0x40; -	REG_WR(bp, BNX2_TBDR_CONFIG, val); +	val |= (BNX2_PAGE_BITS - 8) << 24 | 0x40; +	BNX2_WR(bp, BNX2_TBDR_CONFIG, val);  	val = bp->mac_addr[0] +  	      (bp->mac_addr[1] << 8) + @@ -4922,14 +4927,14 @@ bnx2_init_chip(struct bnx2 *bp)  	      bp->mac_addr[3] +  	      (bp->mac_addr[4] << 8) +  	      (bp->mac_addr[5] << 16); -	REG_WR(bp, BNX2_EMAC_BACKOFF_SEED, val); +	BNX2_WR(bp, BNX2_EMAC_BACKOFF_SEED, val);  	/* Program the MTU.  Also include 4 bytes for CRC32. */  	mtu = bp->dev->mtu;  	val = mtu + ETH_HLEN + ETH_FCS_LEN;  	if (val > (MAX_ETHERNET_PACKET_SIZE + 4))  		val |= BNX2_EMAC_RX_MTU_SIZE_JUMBO_ENA; -	REG_WR(bp, BNX2_EMAC_RX_MTU_SIZE, val); +	BNX2_WR(bp, BNX2_EMAC_RX_MTU_SIZE, val);  	if (mtu < 1500)  		mtu = 1500; @@ -4947,43 +4952,43 @@ bnx2_init_chip(struct bnx2 *bp)  	bp->rx_mode = BNX2_EMAC_RX_MODE_SORT_MODE;  	/* Set up how to generate a link change interrupt. */ -	REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK); +	BNX2_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK); -	REG_WR(bp, BNX2_HC_STATUS_ADDR_L, -	       (u64) bp->status_blk_mapping & 0xffffffff); -	REG_WR(bp, BNX2_HC_STATUS_ADDR_H, (u64) bp->status_blk_mapping >> 32); +	BNX2_WR(bp, BNX2_HC_STATUS_ADDR_L, +		(u64) bp->status_blk_mapping & 0xffffffff); +	BNX2_WR(bp, BNX2_HC_STATUS_ADDR_H, (u64) bp->status_blk_mapping >> 32); -	REG_WR(bp, BNX2_HC_STATISTICS_ADDR_L, -	       (u64) bp->stats_blk_mapping & 0xffffffff); -	REG_WR(bp, BNX2_HC_STATISTICS_ADDR_H, -	       (u64) bp->stats_blk_mapping >> 32); +	BNX2_WR(bp, BNX2_HC_STATISTICS_ADDR_L, +		(u64) bp->stats_blk_mapping & 0xffffffff); +	BNX2_WR(bp, BNX2_HC_STATISTICS_ADDR_H, +		(u64) bp->stats_blk_mapping >> 32); -	REG_WR(bp, BNX2_HC_TX_QUICK_CONS_TRIP, -	       (bp->tx_quick_cons_trip_int << 16) | bp->tx_quick_cons_trip); +	BNX2_WR(bp, BNX2_HC_TX_QUICK_CONS_TRIP, +		(bp->tx_quick_cons_trip_int << 16) | bp->tx_quick_cons_trip); -	REG_WR(bp, BNX2_HC_RX_QUICK_CONS_TRIP, -	       (bp->rx_quick_cons_trip_int << 16) | bp->rx_quick_cons_trip); +	BNX2_WR(bp, BNX2_HC_RX_QUICK_CONS_TRIP, +		(bp->rx_quick_cons_trip_int << 16) | bp->rx_quick_cons_trip); -	REG_WR(bp, BNX2_HC_COMP_PROD_TRIP, -	       (bp->comp_prod_trip_int << 16) | bp->comp_prod_trip); +	BNX2_WR(bp, BNX2_HC_COMP_PROD_TRIP, +		(bp->comp_prod_trip_int << 16) | bp->comp_prod_trip); -	REG_WR(bp, BNX2_HC_TX_TICKS, (bp->tx_ticks_int << 16) | bp->tx_ticks); +	BNX2_WR(bp, BNX2_HC_TX_TICKS, (bp->tx_ticks_int << 16) | bp->tx_ticks); -	REG_WR(bp, BNX2_HC_RX_TICKS, (bp->rx_ticks_int << 16) | bp->rx_ticks); +	BNX2_WR(bp, BNX2_HC_RX_TICKS, (bp->rx_ticks_int << 16) | bp->rx_ticks); -	REG_WR(bp, BNX2_HC_COM_TICKS, -	       (bp->com_ticks_int << 16) | bp->com_ticks); +	BNX2_WR(bp, BNX2_HC_COM_TICKS, +		(bp->com_ticks_int << 16) | bp->com_ticks); -	REG_WR(bp, BNX2_HC_CMD_TICKS, -	       (bp->cmd_ticks_int << 16) | bp->cmd_ticks); +	BNX2_WR(bp, BNX2_HC_CMD_TICKS, +		(bp->cmd_ticks_int << 16) | bp->cmd_ticks);  	if (bp->flags & BNX2_FLAG_BROKEN_STATS) -		REG_WR(bp, BNX2_HC_STATS_TICKS, 0); +		BNX2_WR(bp, BNX2_HC_STATS_TICKS, 0);  	else -		REG_WR(bp, BNX2_HC_STATS_TICKS, bp->stats_ticks); -	REG_WR(bp, BNX2_HC_STAT_COLLECT_TICKS, 0xbb8);  /* 3ms */ +		BNX2_WR(bp, BNX2_HC_STATS_TICKS, bp->stats_ticks); +	BNX2_WR(bp, BNX2_HC_STAT_COLLECT_TICKS, 0xbb8);  /* 3ms */ -	if (CHIP_ID(bp) == CHIP_ID_5706_A1) +	if (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A1)  		val = BNX2_HC_CONFIG_COLLECT_STATS;  	else {  		val = BNX2_HC_CONFIG_RX_TMR_MODE | BNX2_HC_CONFIG_TX_TMR_MODE | @@ -4991,8 +4996,8 @@ bnx2_init_chip(struct bnx2 *bp)  	}  	if (bp->flags & BNX2_FLAG_USING_MSIX) { -		REG_WR(bp, BNX2_HC_MSIX_BIT_VECTOR, -		       BNX2_HC_MSIX_BIT_VECTOR_VAL); +		BNX2_WR(bp, BNX2_HC_MSIX_BIT_VECTOR, +			BNX2_HC_MSIX_BIT_VECTOR_VAL);  		val |= BNX2_HC_CONFIG_SB_ADDR_INC_128B;  	} @@ -5000,7 +5005,7 @@ bnx2_init_chip(struct bnx2 *bp)  	if (bp->flags & BNX2_FLAG_ONE_SHOT_MSI)  		val |= BNX2_HC_CONFIG_ONE_SHOT | BNX2_HC_CONFIG_USE_INT_PARAM; -	REG_WR(bp, BNX2_HC_CONFIG, val); +	BNX2_WR(bp, BNX2_HC_CONFIG, val);  	if (bp->rx_ticks < 25)  		bnx2_reg_wr_ind(bp, BNX2_FW_RX_LOW_LATENCY, 1); @@ -5011,48 +5016,48 @@ bnx2_init_chip(struct bnx2 *bp)  		u32 base = ((i - 1) * BNX2_HC_SB_CONFIG_SIZE) +  			   BNX2_HC_SB_CONFIG_1; -		REG_WR(bp, base, +		BNX2_WR(bp, base,  			BNX2_HC_SB_CONFIG_1_TX_TMR_MODE |  			BNX2_HC_SB_CONFIG_1_RX_TMR_MODE |  			BNX2_HC_SB_CONFIG_1_ONE_SHOT); -		REG_WR(bp, base + BNX2_HC_TX_QUICK_CONS_TRIP_OFF, +		BNX2_WR(bp, base + BNX2_HC_TX_QUICK_CONS_TRIP_OFF,  			(bp->tx_quick_cons_trip_int << 16) |  			 bp->tx_quick_cons_trip); -		REG_WR(bp, base + BNX2_HC_TX_TICKS_OFF, +		BNX2_WR(bp, base + BNX2_HC_TX_TICKS_OFF,  			(bp->tx_ticks_int << 16) | bp->tx_ticks); -		REG_WR(bp, base + BNX2_HC_RX_QUICK_CONS_TRIP_OFF, -		       (bp->rx_quick_cons_trip_int << 16) | +		BNX2_WR(bp, base + BNX2_HC_RX_QUICK_CONS_TRIP_OFF, +			(bp->rx_quick_cons_trip_int << 16) |  			bp->rx_quick_cons_trip); -		REG_WR(bp, base + BNX2_HC_RX_TICKS_OFF, +		BNX2_WR(bp, base + BNX2_HC_RX_TICKS_OFF,  			(bp->rx_ticks_int << 16) | bp->rx_ticks);  	}  	/* Clear internal stats counters. */ -	REG_WR(bp, BNX2_HC_COMMAND, BNX2_HC_COMMAND_CLR_STAT_NOW); +	BNX2_WR(bp, BNX2_HC_COMMAND, BNX2_HC_COMMAND_CLR_STAT_NOW); -	REG_WR(bp, BNX2_HC_ATTN_BITS_ENABLE, STATUS_ATTN_EVENTS); +	BNX2_WR(bp, BNX2_HC_ATTN_BITS_ENABLE, STATUS_ATTN_EVENTS);  	/* Initialize the receive filter. */  	bnx2_set_rx_mode(bp->dev); -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { -		val = REG_RD(bp, BNX2_MISC_NEW_CORE_CTL); +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) { +		val = BNX2_RD(bp, BNX2_MISC_NEW_CORE_CTL);  		val |= BNX2_MISC_NEW_CORE_CTL_DMA_ENABLE; -		REG_WR(bp, BNX2_MISC_NEW_CORE_CTL, val); +		BNX2_WR(bp, BNX2_MISC_NEW_CORE_CTL, val);  	}  	rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT2 | BNX2_DRV_MSG_CODE_RESET,  			  1, 0); -	REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, BNX2_MISC_ENABLE_DEFAULT); -	REG_RD(bp, BNX2_MISC_ENABLE_SET_BITS); +	BNX2_WR(bp, BNX2_MISC_ENABLE_SET_BITS, BNX2_MISC_ENABLE_DEFAULT); +	BNX2_RD(bp, BNX2_MISC_ENABLE_SET_BITS);  	udelay(20); -	bp->hc_cmd = REG_RD(bp, BNX2_HC_COMMAND); +	bp->hc_cmd = BNX2_RD(bp, BNX2_HC_COMMAND);  	return rc;  } @@ -5086,7 +5091,7 @@ bnx2_init_tx_context(struct bnx2 *bp, u32 cid, struct bnx2_tx_ring_info *txr)  	u32 val, offset0, offset1, offset2, offset3;  	u32 cid_addr = GET_CID_ADDR(cid); -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {  		offset0 = BNX2_L2CTX_TYPE_XI;  		offset1 = BNX2_L2CTX_CMD_TYPE_XI;  		offset2 = BNX2_L2CTX_TBDR_BHADDR_HI_XI; @@ -5113,7 +5118,7 @@ bnx2_init_tx_context(struct bnx2 *bp, u32 cid, struct bnx2_tx_ring_info *txr)  static void  bnx2_init_tx_ring(struct bnx2 *bp, int ring_num)  { -	struct tx_bd *txbd; +	struct bnx2_tx_bd *txbd;  	u32 cid = TX_CID;  	struct bnx2_napi *bnapi;  	struct bnx2_tx_ring_info *txr; @@ -5128,7 +5133,7 @@ bnx2_init_tx_ring(struct bnx2 *bp, int ring_num)  	bp->tx_wake_thresh = bp->tx_ring_size / 2; -	txbd = &txr->tx_desc_ring[MAX_TX_DESC_CNT]; +	txbd = &txr->tx_desc_ring[BNX2_MAX_TX_DESC_CNT];  	txbd->tx_bd_haddr_hi = (u64) txr->tx_desc_mapping >> 32;  	txbd->tx_bd_haddr_lo = (u64) txr->tx_desc_mapping & 0xffffffff; @@ -5143,17 +5148,17 @@ bnx2_init_tx_ring(struct bnx2 *bp, int ring_num)  }  static void -bnx2_init_rxbd_rings(struct rx_bd *rx_ring[], dma_addr_t dma[], u32 buf_size, -		     int num_rings) +bnx2_init_rxbd_rings(struct bnx2_rx_bd *rx_ring[], dma_addr_t dma[], +		     u32 buf_size, int num_rings)  {  	int i; -	struct rx_bd *rxbd; +	struct bnx2_rx_bd *rxbd;  	for (i = 0; i < num_rings; i++) {  		int j;  		rxbd = &rx_ring[i][0]; -		for (j = 0; j < MAX_RX_DESC_CNT; j++, rxbd++) { +		for (j = 0; j < BNX2_MAX_RX_DESC_CNT; j++, rxbd++) {  			rxbd->rx_bd_len = buf_size;  			rxbd->rx_bd_flags = RX_BD_FLAGS_START | RX_BD_FLAGS_END;  		} @@ -5187,9 +5192,9 @@ bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)  	bnx2_init_rx_context(bp, cid); -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { -		val = REG_RD(bp, BNX2_MQ_MAP_L2_5); -		REG_WR(bp, BNX2_MQ_MAP_L2_5, val | BNX2_MQ_MAP_L2_5_ARM); +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) { +		val = BNX2_RD(bp, BNX2_MQ_MAP_L2_5); +		BNX2_WR(bp, BNX2_MQ_MAP_L2_5, val | BNX2_MQ_MAP_L2_5_ARM);  	}  	bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_PG_BUF_SIZE, 0); @@ -5208,8 +5213,8 @@ bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)  		val = (u64) rxr->rx_pg_desc_mapping[0] & 0xffffffff;  		bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_PG_BDHADDR_LO, val); -		if (CHIP_NUM(bp) == CHIP_NUM_5709) -			REG_WR(bp, BNX2_MQ_MAP_L2_3, BNX2_MQ_MAP_L2_3_DEFAULT); +		if (BNX2_CHIP(bp) == BNX2_CHIP_5709) +			BNX2_WR(bp, BNX2_MQ_MAP_L2_3, BNX2_MQ_MAP_L2_3_DEFAULT);  	}  	val = (u64) rxr->rx_desc_mapping[0] >> 32; @@ -5225,8 +5230,8 @@ bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)  				    ring_num, i, bp->rx_pg_ring_size);  			break;  		} -		prod = NEXT_RX_BD(prod); -		ring_prod = RX_PG_RING_IDX(prod); +		prod = BNX2_NEXT_RX_BD(prod); +		ring_prod = BNX2_RX_PG_RING_IDX(prod);  	}  	rxr->rx_pg_prod = prod; @@ -5237,8 +5242,8 @@ bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)  				    ring_num, i, bp->rx_ring_size);  			break;  		} -		prod = NEXT_RX_BD(prod); -		ring_prod = RX_RING_IDX(prod); +		prod = BNX2_NEXT_RX_BD(prod); +		ring_prod = BNX2_RX_RING_IDX(prod);  	}  	rxr->rx_prod = prod; @@ -5246,10 +5251,10 @@ bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)  	rxr->rx_bseq_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_HOST_BSEQ;  	rxr->rx_pg_bidx_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_HOST_PG_BDIDX; -	REG_WR16(bp, rxr->rx_pg_bidx_addr, rxr->rx_pg_prod); -	REG_WR16(bp, rxr->rx_bidx_addr, prod); +	BNX2_WR16(bp, rxr->rx_pg_bidx_addr, rxr->rx_pg_prod); +	BNX2_WR16(bp, rxr->rx_bidx_addr, prod); -	REG_WR(bp, rxr->rx_bseq_addr, rxr->rx_prod_bseq); +	BNX2_WR(bp, rxr->rx_bseq_addr, rxr->rx_prod_bseq);  }  static void @@ -5260,15 +5265,15 @@ bnx2_init_all_rings(struct bnx2 *bp)  	bnx2_clear_ring_states(bp); -	REG_WR(bp, BNX2_TSCH_TSS_CFG, 0); +	BNX2_WR(bp, BNX2_TSCH_TSS_CFG, 0);  	for (i = 0; i < bp->num_tx_rings; i++)  		bnx2_init_tx_ring(bp, i);  	if (bp->num_tx_rings > 1) -		REG_WR(bp, BNX2_TSCH_TSS_CFG, ((bp->num_tx_rings - 1) << 24) | -		       (TX_TSS_CID << 7)); +		BNX2_WR(bp, BNX2_TSCH_TSS_CFG, ((bp->num_tx_rings - 1) << 24) | +			(TX_TSS_CID << 7)); -	REG_WR(bp, BNX2_RLUP_RSS_CONFIG, 0); +	BNX2_WR(bp, BNX2_RLUP_RSS_CONFIG, 0);  	bnx2_reg_wr_ind(bp, BNX2_RXP_SCRATCH_RSS_TBL_SZ, 0);  	for (i = 0; i < bp->num_rx_rings; i++) @@ -5282,8 +5287,8 @@ bnx2_init_all_rings(struct bnx2 *bp)  			tbl_32 |= (i % (bp->num_rx_rings - 1)) << shift;  			if ((i % 8) == 7) { -				REG_WR(bp, BNX2_RLUP_RSS_DATA, tbl_32); -				REG_WR(bp, BNX2_RLUP_RSS_COMMAND, (i >> 3) | +				BNX2_WR(bp, BNX2_RLUP_RSS_DATA, tbl_32); +				BNX2_WR(bp, BNX2_RLUP_RSS_COMMAND, (i >> 3) |  					BNX2_RLUP_RSS_COMMAND_RSS_WRITE_MASK |  					BNX2_RLUP_RSS_COMMAND_WRITE |  					BNX2_RLUP_RSS_COMMAND_HASH_MASK); @@ -5294,7 +5299,7 @@ bnx2_init_all_rings(struct bnx2 *bp)  		val = BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_ALL_XI |  		      BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_ALL_XI; -		REG_WR(bp, BNX2_RLUP_RSS_CONFIG, val); +		BNX2_WR(bp, BNX2_RLUP_RSS_CONFIG, val);  	}  } @@ -5303,8 +5308,8 @@ static u32 bnx2_find_max_ring(u32 ring_size, u32 max_size)  {  	u32 max, num_rings = 1; -	while (ring_size > MAX_RX_DESC_CNT) { -		ring_size -= MAX_RX_DESC_CNT; +	while (ring_size > BNX2_MAX_RX_DESC_CNT) { +		ring_size -= BNX2_MAX_RX_DESC_CNT;  		num_rings++;  	}  	/* round to next power of 2 */ @@ -5337,13 +5342,14 @@ bnx2_set_rx_ring_size(struct bnx2 *bp, u32 size)  		int pages = PAGE_ALIGN(bp->dev->mtu - 40) >> PAGE_SHIFT;  		jumbo_size = size * pages; -		if (jumbo_size > MAX_TOTAL_RX_PG_DESC_CNT) -			jumbo_size = MAX_TOTAL_RX_PG_DESC_CNT; +		if (jumbo_size > BNX2_MAX_TOTAL_RX_PG_DESC_CNT) +			jumbo_size = BNX2_MAX_TOTAL_RX_PG_DESC_CNT;  		bp->rx_pg_ring_size = jumbo_size;  		bp->rx_max_pg_ring = bnx2_find_max_ring(jumbo_size, -							MAX_RX_PG_RINGS); -		bp->rx_max_pg_ring_idx = (bp->rx_max_pg_ring * RX_DESC_CNT) - 1; +							BNX2_MAX_RX_PG_RINGS); +		bp->rx_max_pg_ring_idx = +			(bp->rx_max_pg_ring * BNX2_RX_DESC_CNT) - 1;  		rx_size = BNX2_RX_COPY_THRESH + BNX2_RX_OFFSET;  		bp->rx_copy_thresh = 0;  	} @@ -5354,8 +5360,8 @@ bnx2_set_rx_ring_size(struct bnx2 *bp, u32 size)  		NET_SKB_PAD + SKB_DATA_ALIGN(sizeof(struct skb_shared_info));  	bp->rx_jumbo_thresh = rx_size - BNX2_RX_OFFSET;  	bp->rx_ring_size = size; -	bp->rx_max_ring = bnx2_find_max_ring(size, MAX_RX_RINGS); -	bp->rx_max_ring_idx = (bp->rx_max_ring * RX_DESC_CNT) - 1; +	bp->rx_max_ring = bnx2_find_max_ring(size, BNX2_MAX_RX_RINGS); +	bp->rx_max_ring_idx = (bp->rx_max_ring * BNX2_RX_DESC_CNT) - 1;  }  static void @@ -5371,13 +5377,13 @@ bnx2_free_tx_skbs(struct bnx2 *bp)  		if (txr->tx_buf_ring == NULL)  			continue; -		for (j = 0; j < TX_DESC_CNT; ) { -			struct sw_tx_bd *tx_buf = &txr->tx_buf_ring[j]; +		for (j = 0; j < BNX2_TX_DESC_CNT; ) { +			struct bnx2_sw_tx_bd *tx_buf = &txr->tx_buf_ring[j];  			struct sk_buff *skb = tx_buf->skb;  			int k, last;  			if (skb == NULL) { -				j = NEXT_TX_BD(j); +				j = BNX2_NEXT_TX_BD(j);  				continue;  			} @@ -5389,9 +5395,9 @@ bnx2_free_tx_skbs(struct bnx2 *bp)  			tx_buf->skb = NULL;  			last = tx_buf->nr_frags; -			j = NEXT_TX_BD(j); -			for (k = 0; k < last; k++, j = NEXT_TX_BD(j)) { -				tx_buf = &txr->tx_buf_ring[TX_RING_IDX(j)]; +			j = BNX2_NEXT_TX_BD(j); +			for (k = 0; k < last; k++, j = BNX2_NEXT_TX_BD(j)) { +				tx_buf = &txr->tx_buf_ring[BNX2_TX_RING_IDX(j)];  				dma_unmap_page(&bp->pdev->dev,  					dma_unmap_addr(tx_buf, mapping),  					skb_frag_size(&skb_shinfo(skb)->frags[k]), @@ -5417,7 +5423,7 @@ bnx2_free_rx_skbs(struct bnx2 *bp)  			return;  		for (j = 0; j < bp->rx_max_ring_idx; j++) { -			struct sw_bd *rx_buf = &rxr->rx_buf_ring[j]; +			struct bnx2_sw_bd *rx_buf = &rxr->rx_buf_ring[j];  			u8 *data = rx_buf->data;  			if (data == NULL) @@ -5615,7 +5621,7 @@ bnx2_test_registers(struct bnx2 *bp)  	ret = 0;  	is_5709 = 0; -	if (CHIP_NUM(bp) == CHIP_NUM_5709) +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709)  		is_5709 = 1;  	for (i = 0; reg_tbl[i].offset != 0xffff; i++) { @@ -5714,7 +5720,7 @@ bnx2_test_memory(struct bnx2 *bp)  	};  	struct mem_entry *mem_tbl; -	if (CHIP_NUM(bp) == CHIP_NUM_5709) +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709)  		mem_tbl = mem_tbl_5709;  	else  		mem_tbl = mem_tbl_5706; @@ -5741,8 +5747,8 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)  	unsigned char *packet;  	u16 rx_start_idx, rx_idx;  	dma_addr_t map; -	struct tx_bd *txbd; -	struct sw_bd *rx_buf; +	struct bnx2_tx_bd *txbd; +	struct bnx2_sw_bd *rx_buf;  	struct l2_fhdr *rx_hdr;  	int ret = -ENODEV;  	struct bnx2_napi *bnapi = &bp->bnx2_napi[0], *tx_napi; @@ -5784,17 +5790,17 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)  		return -EIO;  	} -	REG_WR(bp, BNX2_HC_COMMAND, -	       bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); +	BNX2_WR(bp, BNX2_HC_COMMAND, +		bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); -	REG_RD(bp, BNX2_HC_COMMAND); +	BNX2_RD(bp, BNX2_HC_COMMAND);  	udelay(5);  	rx_start_idx = bnx2_get_hw_rx_cons(bnapi);  	num_pkts = 0; -	txbd = &txr->tx_desc_ring[TX_RING_IDX(txr->tx_prod)]; +	txbd = &txr->tx_desc_ring[BNX2_TX_RING_IDX(txr->tx_prod)];  	txbd->tx_bd_haddr_hi = (u64) map >> 32;  	txbd->tx_bd_haddr_lo = (u64) map & 0xffffffff; @@ -5802,18 +5808,18 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)  	txbd->tx_bd_vlan_tag_flags = TX_BD_FLAGS_START | TX_BD_FLAGS_END;  	num_pkts++; -	txr->tx_prod = NEXT_TX_BD(txr->tx_prod); +	txr->tx_prod = BNX2_NEXT_TX_BD(txr->tx_prod);  	txr->tx_prod_bseq += pkt_size; -	REG_WR16(bp, txr->tx_bidx_addr, txr->tx_prod); -	REG_WR(bp, txr->tx_bseq_addr, txr->tx_prod_bseq); +	BNX2_WR16(bp, txr->tx_bidx_addr, txr->tx_prod); +	BNX2_WR(bp, txr->tx_bseq_addr, txr->tx_prod_bseq);  	udelay(100); -	REG_WR(bp, BNX2_HC_COMMAND, -	       bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); +	BNX2_WR(bp, BNX2_HC_COMMAND, +		bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); -	REG_RD(bp, BNX2_HC_COMMAND); +	BNX2_RD(bp, BNX2_HC_COMMAND);  	udelay(5); @@ -5962,14 +5968,14 @@ bnx2_test_intr(struct bnx2 *bp)  	if (!netif_running(bp->dev))  		return -ENODEV; -	status_idx = REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff; +	status_idx = BNX2_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff;  	/* This register is not touched during run-time. */ -	REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW); -	REG_RD(bp, BNX2_HC_COMMAND); +	BNX2_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW); +	BNX2_RD(bp, BNX2_HC_COMMAND);  	for (i = 0; i < 10; i++) { -		if ((REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff) != +		if ((BNX2_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff) !=  			status_idx) {  			break; @@ -6132,11 +6138,11 @@ bnx2_timer(unsigned long data)  	/* workaround occasional corrupted counters */  	if ((bp->flags & BNX2_FLAG_BROKEN_STATS) && bp->stats_ticks) -		REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | -					    BNX2_HC_COMMAND_STATS_NOW); +		BNX2_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | +			BNX2_HC_COMMAND_STATS_NOW);  	if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { -		if (CHIP_NUM(bp) == CHIP_NUM_5706) +		if (BNX2_CHIP(bp) == BNX2_CHIP_5706)  			bnx2_5706_serdes_timer(bp);  		else  			bnx2_5708_serdes_timer(bp); @@ -6205,13 +6211,13 @@ bnx2_enable_msix(struct bnx2 *bp, int msix_vecs)  	const int len = sizeof(bp->irq_tbl[0].name);  	bnx2_setup_msix_tbl(bp); -	REG_WR(bp, BNX2_PCI_MSIX_CONTROL, BNX2_MAX_MSIX_HW_VEC - 1); -	REG_WR(bp, BNX2_PCI_MSIX_TBL_OFF_BIR, BNX2_PCI_GRC_WINDOW2_BASE); -	REG_WR(bp, BNX2_PCI_MSIX_PBA_OFF_BIT, BNX2_PCI_GRC_WINDOW3_BASE); +	BNX2_WR(bp, BNX2_PCI_MSIX_CONTROL, BNX2_MAX_MSIX_HW_VEC - 1); +	BNX2_WR(bp, BNX2_PCI_MSIX_TBL_OFF_BIR, BNX2_PCI_GRC_WINDOW2_BASE); +	BNX2_WR(bp, BNX2_PCI_MSIX_PBA_OFF_BIT, BNX2_PCI_GRC_WINDOW3_BASE);  	/*  Need to flush the previous three writes to ensure MSI-X  	 *  is setup properly */ -	REG_RD(bp, BNX2_PCI_MSIX_CONTROL); +	BNX2_RD(bp, BNX2_PCI_MSIX_CONTROL);  	for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) {  		msix_ent[i].entry = i; @@ -6274,7 +6280,7 @@ bnx2_setup_int_mode(struct bnx2 *bp, int dis_msi)  	    !(bp->flags & BNX2_FLAG_USING_MSIX)) {  		if (pci_enable_msi(bp->pdev) == 0) {  			bp->flags |= BNX2_FLAG_USING_MSI; -			if (CHIP_NUM(bp) == CHIP_NUM_5709) { +			if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {  				bp->flags |= BNX2_FLAG_ONE_SHOT_MSI;  				bp->irq_tbl[0].handler = bnx2_msi_1shot;  			} else @@ -6464,22 +6470,22 @@ bnx2_dump_ftq(struct bnx2 *bp)  	netdev_err(dev, "<--- end FTQ dump --->\n");  	netdev_err(dev, "<--- start TBDC dump --->\n");  	netdev_err(dev, "TBDC free cnt: %ld\n", -		   REG_RD(bp, BNX2_TBDC_STATUS) & BNX2_TBDC_STATUS_FREE_CNT); +		   BNX2_RD(bp, BNX2_TBDC_STATUS) & BNX2_TBDC_STATUS_FREE_CNT);  	netdev_err(dev, "LINE     CID  BIDX   CMD  VALIDS\n");  	for (i = 0; i < 0x20; i++) {  		int j = 0; -		REG_WR(bp, BNX2_TBDC_BD_ADDR, i); -		REG_WR(bp, BNX2_TBDC_CAM_OPCODE, -		       BNX2_TBDC_CAM_OPCODE_OPCODE_CAM_READ); -		REG_WR(bp, BNX2_TBDC_COMMAND, BNX2_TBDC_COMMAND_CMD_REG_ARB); -		while ((REG_RD(bp, BNX2_TBDC_COMMAND) & +		BNX2_WR(bp, BNX2_TBDC_BD_ADDR, i); +		BNX2_WR(bp, BNX2_TBDC_CAM_OPCODE, +			BNX2_TBDC_CAM_OPCODE_OPCODE_CAM_READ); +		BNX2_WR(bp, BNX2_TBDC_COMMAND, BNX2_TBDC_COMMAND_CMD_REG_ARB); +		while ((BNX2_RD(bp, BNX2_TBDC_COMMAND) &  			BNX2_TBDC_COMMAND_CMD_REG_ARB) && j < 100)  			j++; -		cid = REG_RD(bp, BNX2_TBDC_CID); -		bdidx = REG_RD(bp, BNX2_TBDC_BIDX); -		valid = REG_RD(bp, BNX2_TBDC_CAM_OPCODE); +		cid = BNX2_RD(bp, BNX2_TBDC_CID); +		bdidx = BNX2_RD(bp, BNX2_TBDC_BIDX); +		valid = BNX2_RD(bp, BNX2_TBDC_CAM_OPCODE);  		netdev_err(dev, "%02x    %06x  %04lx   %02x    [%x]\n",  			   i, cid, bdidx & BNX2_TBDC_BDIDX_BDIDX,  			   bdidx >> 24, (valid >> 8) & 0x0ff); @@ -6500,15 +6506,15 @@ bnx2_dump_state(struct bnx2 *bp)  	pci_read_config_dword(bp->pdev, BNX2_PCICFG_MISC_CONFIG, &val2);  	netdev_err(dev, "DEBUG: PCI_PM[%08x] PCI_MISC_CFG[%08x]\n", val1, val2);  	netdev_err(dev, "DEBUG: EMAC_TX_STATUS[%08x] EMAC_RX_STATUS[%08x]\n", -		   REG_RD(bp, BNX2_EMAC_TX_STATUS), -		   REG_RD(bp, BNX2_EMAC_RX_STATUS)); +		   BNX2_RD(bp, BNX2_EMAC_TX_STATUS), +		   BNX2_RD(bp, BNX2_EMAC_RX_STATUS));  	netdev_err(dev, "DEBUG: RPM_MGMT_PKT_CTRL[%08x]\n", -		   REG_RD(bp, BNX2_RPM_MGMT_PKT_CTRL)); +		   BNX2_RD(bp, BNX2_RPM_MGMT_PKT_CTRL));  	netdev_err(dev, "DEBUG: HC_STATS_INTERRUPT_STATUS[%08x]\n", -		   REG_RD(bp, BNX2_HC_STATS_INTERRUPT_STATUS)); +		   BNX2_RD(bp, BNX2_HC_STATS_INTERRUPT_STATUS));  	if (bp->flags & BNX2_FLAG_USING_MSIX)  		netdev_err(dev, "DEBUG: PBA[%08x]\n", -			   REG_RD(bp, BNX2_PCI_GRC_WINDOW3_BASE)); +			   BNX2_RD(bp, BNX2_PCI_GRC_WINDOW3_BASE));  }  static void @@ -6533,8 +6539,8 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)  {  	struct bnx2 *bp = netdev_priv(dev);  	dma_addr_t mapping; -	struct tx_bd *txbd; -	struct sw_tx_bd *tx_buf; +	struct bnx2_tx_bd *txbd; +	struct bnx2_sw_tx_bd *tx_buf;  	u32 len, vlan_tag_flags, last_frag, mss;  	u16 prod, ring_prod;  	int i; @@ -6557,7 +6563,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)  	}  	len = skb_headlen(skb);  	prod = txr->tx_prod; -	ring_prod = TX_RING_IDX(prod); +	ring_prod = BNX2_TX_RING_IDX(prod);  	vlan_tag_flags = 0;  	if (skb->ip_summed == CHECKSUM_PARTIAL) { @@ -6627,8 +6633,8 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)  	for (i = 0; i < last_frag; i++) {  		const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; -		prod = NEXT_TX_BD(prod); -		ring_prod = TX_RING_IDX(prod); +		prod = BNX2_NEXT_TX_BD(prod); +		ring_prod = BNX2_TX_RING_IDX(prod);  		txbd = &txr->tx_desc_ring[ring_prod];  		len = skb_frag_size(frag); @@ -6652,11 +6658,11 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)  	netdev_tx_sent_queue(txq, skb->len); -	prod = NEXT_TX_BD(prod); +	prod = BNX2_NEXT_TX_BD(prod);  	txr->tx_prod_bseq += skb->len; -	REG_WR16(bp, txr->tx_bidx_addr, prod); -	REG_WR(bp, txr->tx_bseq_addr, txr->tx_prod_bseq); +	BNX2_WR16(bp, txr->tx_bidx_addr, prod); +	BNX2_WR(bp, txr->tx_bseq_addr, txr->tx_prod_bseq);  	mmiowb(); @@ -6682,7 +6688,7 @@ dma_error:  	/* start back at beginning and unmap skb */  	prod = txr->tx_prod; -	ring_prod = TX_RING_IDX(prod); +	ring_prod = BNX2_TX_RING_IDX(prod);  	tx_buf = &txr->tx_buf_ring[ring_prod];  	tx_buf->skb = NULL;  	dma_unmap_single(&bp->pdev->dev, dma_unmap_addr(tx_buf, mapping), @@ -6690,8 +6696,8 @@ dma_error:  	/* unmap remaining mapped pages */  	for (i = 0; i < last_frag; i++) { -		prod = NEXT_TX_BD(prod); -		ring_prod = TX_RING_IDX(prod); +		prod = BNX2_NEXT_TX_BD(prod); +		ring_prod = BNX2_TX_RING_IDX(prod);  		tx_buf = &txr->tx_buf_ring[ring_prod];  		dma_unmap_page(&bp->pdev->dev, dma_unmap_addr(tx_buf, mapping),  			       skb_frag_size(&skb_shinfo(skb)->frags[i]), @@ -6810,8 +6816,8 @@ bnx2_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *net_stats)  		GET_32BIT_NET_STATS(stat_Dot3StatsExcessiveCollisions) +  		GET_32BIT_NET_STATS(stat_Dot3StatsLateCollisions); -	if ((CHIP_NUM(bp) == CHIP_NUM_5706) || -	    (CHIP_ID(bp) == CHIP_ID_5708_A0)) +	if ((BNX2_CHIP(bp) == BNX2_CHIP_5706) || +	    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_A0))  		net_stats->tx_carrier_errors = 0;  	else {  		net_stats->tx_carrier_errors = @@ -7030,7 +7036,7 @@ bnx2_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *_p)  	offset = reg_boundaries[0];  	p += offset;  	while (offset < BNX2_REGDUMP_LEN) { -		*p++ = REG_RD(bp, offset); +		*p++ = BNX2_RD(bp, offset);  		offset += 4;  		if (offset == reg_boundaries[i + 1]) {  			offset = reg_boundaries[i + 2]; @@ -7254,13 +7260,13 @@ bnx2_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)  {  	struct bnx2 *bp = netdev_priv(dev); -	ering->rx_max_pending = MAX_TOTAL_RX_DESC_CNT; -	ering->rx_jumbo_max_pending = MAX_TOTAL_RX_PG_DESC_CNT; +	ering->rx_max_pending = BNX2_MAX_TOTAL_RX_DESC_CNT; +	ering->rx_jumbo_max_pending = BNX2_MAX_TOTAL_RX_PG_DESC_CNT;  	ering->rx_pending = bp->rx_ring_size;  	ering->rx_jumbo_pending = bp->rx_pg_ring_size; -	ering->tx_max_pending = MAX_TX_DESC_CNT; +	ering->tx_max_pending = BNX2_MAX_TX_DESC_CNT;  	ering->tx_pending = bp->tx_ring_size;  } @@ -7326,8 +7332,8 @@ bnx2_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)  	struct bnx2 *bp = netdev_priv(dev);  	int rc; -	if ((ering->rx_pending > MAX_TOTAL_RX_DESC_CNT) || -		(ering->tx_pending > MAX_TX_DESC_CNT) || +	if ((ering->rx_pending > BNX2_MAX_TOTAL_RX_DESC_CNT) || +		(ering->tx_pending > BNX2_MAX_TX_DESC_CNT) ||  		(ering->tx_pending <= MAX_SKB_FRAGS)) {  		return -EINVAL; @@ -7614,10 +7620,10 @@ bnx2_get_ethtool_stats(struct net_device *dev,  		return;  	} -	if ((CHIP_ID(bp) == CHIP_ID_5706_A0) || -	    (CHIP_ID(bp) == CHIP_ID_5706_A1) || -	    (CHIP_ID(bp) == CHIP_ID_5706_A2) || -	    (CHIP_ID(bp) == CHIP_ID_5708_A0)) +	if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) || +	    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A1) || +	    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A2) || +	    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_A0))  		stats_len_arr = bnx2_5706_stats_len_arr;  	else  		stats_len_arr = bnx2_5708_stats_len_arr; @@ -7655,26 +7661,26 @@ bnx2_set_phys_id(struct net_device *dev, enum ethtool_phys_id_state state)  	case ETHTOOL_ID_ACTIVE:  		bnx2_set_power_state(bp, PCI_D0); -		bp->leds_save = REG_RD(bp, BNX2_MISC_CFG); -		REG_WR(bp, BNX2_MISC_CFG, BNX2_MISC_CFG_LEDMODE_MAC); +		bp->leds_save = BNX2_RD(bp, BNX2_MISC_CFG); +		BNX2_WR(bp, BNX2_MISC_CFG, BNX2_MISC_CFG_LEDMODE_MAC);  		return 1;	/* cycle on/off once per second */  	case ETHTOOL_ID_ON: -		REG_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE | -		       BNX2_EMAC_LED_1000MB_OVERRIDE | -		       BNX2_EMAC_LED_100MB_OVERRIDE | -		       BNX2_EMAC_LED_10MB_OVERRIDE | -		       BNX2_EMAC_LED_TRAFFIC_OVERRIDE | -		       BNX2_EMAC_LED_TRAFFIC); +		BNX2_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE | +			BNX2_EMAC_LED_1000MB_OVERRIDE | +			BNX2_EMAC_LED_100MB_OVERRIDE | +			BNX2_EMAC_LED_10MB_OVERRIDE | +			BNX2_EMAC_LED_TRAFFIC_OVERRIDE | +			BNX2_EMAC_LED_TRAFFIC);  		break;  	case ETHTOOL_ID_OFF: -		REG_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE); +		BNX2_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE);  		break;  	case ETHTOOL_ID_INACTIVE: -		REG_WR(bp, BNX2_EMAC_LED, 0); -		REG_WR(bp, BNX2_MISC_CFG, bp->leds_save); +		BNX2_WR(bp, BNX2_EMAC_LED, 0); +		BNX2_WR(bp, BNX2_MISC_CFG, bp->leds_save);  		if (!netif_running(dev))  			bnx2_set_power_state(bp, PCI_D3hot); @@ -7896,10 +7902,10 @@ poll_bnx2(struct net_device *dev)  }  #endif -static void __devinit +static void  bnx2_get_5709_media(struct bnx2 *bp)  { -	u32 val = REG_RD(bp, BNX2_MISC_DUAL_MEDIA_CTRL); +	u32 val = BNX2_RD(bp, BNX2_MISC_DUAL_MEDIA_CTRL);  	u32 bond_id = val & BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID;  	u32 strap; @@ -7934,18 +7940,18 @@ bnx2_get_5709_media(struct bnx2 *bp)  	}  } -static void __devinit +static void  bnx2_get_pci_speed(struct bnx2 *bp)  {  	u32 reg; -	reg = REG_RD(bp, BNX2_PCICFG_MISC_STATUS); +	reg = BNX2_RD(bp, BNX2_PCICFG_MISC_STATUS);  	if (reg & BNX2_PCICFG_MISC_STATUS_PCIX_DET) {  		u32 clkreg;  		bp->flags |= BNX2_FLAG_PCIX; -		clkreg = REG_RD(bp, BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS); +		clkreg = BNX2_RD(bp, BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS);  		clkreg &= BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET;  		switch (clkreg) { @@ -7986,7 +7992,7 @@ bnx2_get_pci_speed(struct bnx2 *bp)  } -static void __devinit +static void  bnx2_read_vpd_fw_ver(struct bnx2 *bp)  {  	int rc, i, j; @@ -8054,7 +8060,7 @@ vpd_done:  	kfree(data);  } -static int __devinit +static int  bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)  {  	struct bnx2 *bp; @@ -8131,20 +8137,20 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)  	 * Rely on CPU to do target byte swapping on big endian systems  	 * The chip's target access swapping will not swap all accesses  	 */ -	REG_WR(bp, BNX2_PCICFG_MISC_CONFIG, -		   BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA | -		   BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP); +	BNX2_WR(bp, BNX2_PCICFG_MISC_CONFIG, +		BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA | +		BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP); -	bp->chip_id = REG_RD(bp, BNX2_MISC_ID); +	bp->chip_id = BNX2_RD(bp, BNX2_MISC_ID); -	if (CHIP_NUM(bp) == CHIP_NUM_5709) { +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {  		if (!pci_is_pcie(pdev)) {  			dev_err(&pdev->dev, "Not PCIE, aborting\n");  			rc = -EIO;  			goto err_out_unmap;  		}  		bp->flags |= BNX2_FLAG_PCIE; -		if (CHIP_REV(bp) == CHIP_REV_Ax) +		if (BNX2_CHIP_REV(bp) == BNX2_CHIP_REV_Ax)  			bp->flags |= BNX2_FLAG_JUMBO_BROKEN;  		/* AER (Advanced Error Reporting) hooks */ @@ -8163,18 +8169,20 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)  		bp->flags |= BNX2_FLAG_BROKEN_STATS;  	} -	if (CHIP_NUM(bp) == CHIP_NUM_5709 && CHIP_REV(bp) != CHIP_REV_Ax) { +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709 && +	    BNX2_CHIP_REV(bp) != BNX2_CHIP_REV_Ax) {  		if (pci_find_capability(pdev, PCI_CAP_ID_MSIX))  			bp->flags |= BNX2_FLAG_MSIX_CAP;  	} -	if (CHIP_ID(bp) != CHIP_ID_5706_A0 && CHIP_ID(bp) != CHIP_ID_5706_A1) { +	if (BNX2_CHIP_ID(bp) != BNX2_CHIP_ID_5706_A0 && +	    BNX2_CHIP_ID(bp) != BNX2_CHIP_ID_5706_A1) {  		if (pci_find_capability(pdev, PCI_CAP_ID_MSI))  			bp->flags |= BNX2_FLAG_MSI_CAP;  	}  	/* 5708 cannot support DMA addresses > 40-bit.  */ -	if (CHIP_NUM(bp) == CHIP_NUM_5708) +	if (BNX2_CHIP(bp) == BNX2_CHIP_5708)  		persist_dma_mask = dma_mask = DMA_BIT_MASK(40);  	else  		persist_dma_mask = dma_mask = DMA_BIT_MASK(64); @@ -8197,12 +8205,11 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)  		bnx2_get_pci_speed(bp);  	/* 5706A0 may falsely detect SERR and PERR. */ -	if (CHIP_ID(bp) == CHIP_ID_5706_A0) { -		reg = REG_RD(bp, PCI_COMMAND); +	if (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) { +		reg = BNX2_RD(bp, PCI_COMMAND);  		reg &= ~(PCI_COMMAND_SERR | PCI_COMMAND_PARITY); -		REG_WR(bp, PCI_COMMAND, reg); -	} -	else if ((CHIP_ID(bp) == CHIP_ID_5706_A1) && +		BNX2_WR(bp, PCI_COMMAND, reg); +	} else if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A1) &&  		!(bp->flags & BNX2_FLAG_PCIX)) {  		dev_err(&pdev->dev, @@ -8299,7 +8306,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)  	bp->mac_addr[4] = (u8) (reg >> 8);  	bp->mac_addr[5] = (u8) reg; -	bp->tx_ring_size = MAX_TX_DESC_CNT; +	bp->tx_ring_size = BNX2_MAX_TX_DESC_CNT;  	bnx2_set_rx_ring_size(bp, 255);  	bp->tx_quick_cons_trip_int = 2; @@ -8319,9 +8326,9 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)  	bp->phy_addr = 1;  	/* Disable WOL support if we are running on a SERDES chip. */ -	if (CHIP_NUM(bp) == CHIP_NUM_5709) +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709)  		bnx2_get_5709_media(bp); -	else if (CHIP_BOND_ID(bp) & CHIP_BOND_ID_SERDES_BIT) +	else if (BNX2_CHIP_BOND(bp) & BNX2_CHIP_BOND_SERDES_BIT)  		bp->phy_flags |= BNX2_PHY_FLAG_SERDES;  	bp->phy_port = PORT_TP; @@ -8332,7 +8339,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)  			bp->flags |= BNX2_FLAG_NO_WOL;  			bp->wol = 0;  		} -		if (CHIP_NUM(bp) == CHIP_NUM_5706) { +		if (BNX2_CHIP(bp) == BNX2_CHIP_5706) {  			/* Don't do parallel detect on this board because of  			 * some board problems.  The link will not go down  			 * if we do parallel detect. @@ -8345,25 +8352,25 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)  			if (reg & BNX2_SHARED_HW_CFG_PHY_2_5G)  				bp->phy_flags |= BNX2_PHY_FLAG_2_5G_CAPABLE;  		} -	} else if (CHIP_NUM(bp) == CHIP_NUM_5706 || -		   CHIP_NUM(bp) == CHIP_NUM_5708) +	} else if (BNX2_CHIP(bp) == BNX2_CHIP_5706 || +		   BNX2_CHIP(bp) == BNX2_CHIP_5708)  		bp->phy_flags |= BNX2_PHY_FLAG_CRC_FIX; -	else if (CHIP_NUM(bp) == CHIP_NUM_5709 && -		 (CHIP_REV(bp) == CHIP_REV_Ax || -		  CHIP_REV(bp) == CHIP_REV_Bx)) +	else if (BNX2_CHIP(bp) == BNX2_CHIP_5709 && +		 (BNX2_CHIP_REV(bp) == BNX2_CHIP_REV_Ax || +		  BNX2_CHIP_REV(bp) == BNX2_CHIP_REV_Bx))  		bp->phy_flags |= BNX2_PHY_FLAG_DIS_EARLY_DAC;  	bnx2_init_fw_cap(bp); -	if ((CHIP_ID(bp) == CHIP_ID_5708_A0) || -	    (CHIP_ID(bp) == CHIP_ID_5708_B0) || -	    (CHIP_ID(bp) == CHIP_ID_5708_B1) || -	    !(REG_RD(bp, BNX2_PCI_CONFIG_3) & BNX2_PCI_CONFIG_3_VAUX_PRESET)) { +	if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_A0) || +	    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_B0) || +	    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_B1) || +	    !(BNX2_RD(bp, BNX2_PCI_CONFIG_3) & BNX2_PCI_CONFIG_3_VAUX_PRESET)) {  		bp->flags |= BNX2_FLAG_NO_WOL;  		bp->wol = 0;  	} -	if (CHIP_ID(bp) == CHIP_ID_5706_A0) { +	if (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) {  		bp->tx_quick_cons_trip_int =  			bp->tx_quick_cons_trip;  		bp->tx_ticks_int = bp->tx_ticks; @@ -8385,7 +8392,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)  	 * AMD believes this incompatibility is unique to the 5706, and  	 * prefers to locally disable MSI rather than globally disabling it.  	 */ -	if (CHIP_NUM(bp) == CHIP_NUM_5706 && disable_msi == 0) { +	if (BNX2_CHIP(bp) == BNX2_CHIP_5706 && disable_msi == 0) {  		struct pci_dev *amd_8132 = NULL;  		while ((amd_8132 = pci_get_device(PCI_VENDOR_ID_AMD, @@ -8414,6 +8421,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)  		bp->cnic_eth_dev.max_iscsi_conn =  			(bnx2_shmem_rd(bp, BNX2_ISCSI_MAX_CONN) &  			 BNX2_ISCSI_MAX_CONN_MASK) >> BNX2_ISCSI_MAX_CONN_SHIFT; +	bp->cnic_probe = bnx2_cnic_probe;  #endif  	pci_save_state(pdev); @@ -8439,7 +8447,7 @@ err_out:  	return rc;  } -static char * __devinit +static char *  bnx2_bus_string(struct bnx2 *bp, char *str)  {  	char *s = str; @@ -8505,7 +8513,7 @@ static const struct net_device_ops bnx2_netdev_ops = {  #endif  }; -static int __devinit +static int  bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  {  	static int version_printed = 0; @@ -8541,7 +8549,7 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  		NETIF_F_TSO | NETIF_F_TSO_ECN |  		NETIF_F_RXHASH | NETIF_F_RXCSUM; -	if (CHIP_NUM(bp) == CHIP_NUM_5709) +	if (BNX2_CHIP(bp) == BNX2_CHIP_5709)  		dev->hw_features |= NETIF_F_IPV6_CSUM | NETIF_F_TSO6;  	dev->vlan_features = dev->hw_features; @@ -8556,8 +8564,8 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  	netdev_info(dev, "%s (%c%d) %s found at mem %lx, IRQ %d, "  		    "node addr %pM\n", board_info[ent->driver_data].name, -		    ((CHIP_ID(bp) & 0xf000) >> 12) + 'A', -		    ((CHIP_ID(bp) & 0x0ff0) >> 4), +		    ((BNX2_CHIP_ID(bp) & 0xf000) >> 12) + 'A', +		    ((BNX2_CHIP_ID(bp) & 0x0ff0) >> 4),  		    bnx2_bus_string(bp, str), (long)pci_resource_start(pdev, 0),  		    pdev->irq, dev->dev_addr); @@ -8573,7 +8581,7 @@ err_free:  	return rc;  } -static void __devexit +static void  bnx2_remove_one(struct pci_dev *pdev)  {  	struct net_device *dev = pci_get_drvdata(pdev); @@ -8752,7 +8760,7 @@ static struct pci_driver bnx2_pci_driver = {  	.name		= DRV_MODULE_NAME,  	.id_table	= bnx2_pci_tbl,  	.probe		= bnx2_init_one, -	.remove		= __devexit_p(bnx2_remove_one), +	.remove		= bnx2_remove_one,  	.suspend	= bnx2_suspend,  	.resume		= bnx2_resume,  	.err_handler	= &bnx2_err_handler, diff --git a/drivers/net/ethernet/broadcom/bnx2.h b/drivers/net/ethernet/broadcom/bnx2.h index af6451dec295..172efbecfea2 100644 --- a/drivers/net/ethernet/broadcom/bnx2.h +++ b/drivers/net/ethernet/broadcom/bnx2.h @@ -20,7 +20,7 @@  /*   *  tx_bd definition   */ -struct tx_bd { +struct bnx2_tx_bd {  	u32 tx_bd_haddr_hi;  	u32 tx_bd_haddr_lo;  	u32 tx_bd_mss_nbytes; @@ -48,7 +48,7 @@ struct tx_bd {  /*   *  rx_bd definition   */ -struct rx_bd { +struct bnx2_rx_bd {  	u32 rx_bd_haddr_hi;  	u32 rx_bd_haddr_lo;  	u32 rx_bd_len; @@ -6538,37 +6538,38 @@ struct l2_fhdr {  /* Use CPU native page size up to 16K for the ring sizes.  */  #if (PAGE_SHIFT > 14) -#define BCM_PAGE_BITS	14 +#define BNX2_PAGE_BITS	14  #else -#define BCM_PAGE_BITS	PAGE_SHIFT +#define BNX2_PAGE_BITS	PAGE_SHIFT  #endif -#define BCM_PAGE_SIZE	(1 << BCM_PAGE_BITS) +#define BNX2_PAGE_SIZE	(1 << BNX2_PAGE_BITS) -#define TX_DESC_CNT  (BCM_PAGE_SIZE / sizeof(struct tx_bd)) -#define MAX_TX_DESC_CNT (TX_DESC_CNT - 1) +#define BNX2_TX_DESC_CNT  (BNX2_PAGE_SIZE / sizeof(struct bnx2_tx_bd)) +#define BNX2_MAX_TX_DESC_CNT (BNX2_TX_DESC_CNT - 1) -#define MAX_RX_RINGS	8 -#define MAX_RX_PG_RINGS	32 -#define RX_DESC_CNT  (BCM_PAGE_SIZE / sizeof(struct rx_bd)) -#define MAX_RX_DESC_CNT (RX_DESC_CNT - 1) -#define MAX_TOTAL_RX_DESC_CNT (MAX_RX_DESC_CNT * MAX_RX_RINGS) -#define MAX_TOTAL_RX_PG_DESC_CNT (MAX_RX_DESC_CNT * MAX_RX_PG_RINGS) +#define BNX2_MAX_RX_RINGS	8 +#define BNX2_MAX_RX_PG_RINGS	32 +#define BNX2_RX_DESC_CNT  (BNX2_PAGE_SIZE / sizeof(struct bnx2_rx_bd)) +#define BNX2_MAX_RX_DESC_CNT (BNX2_RX_DESC_CNT - 1) +#define BNX2_MAX_TOTAL_RX_DESC_CNT (BNX2_MAX_RX_DESC_CNT * BNX2_MAX_RX_RINGS) +#define BNX2_MAX_TOTAL_RX_PG_DESC_CNT	\ +	(BNX2_MAX_RX_DESC_CNT * BNX2_MAX_RX_PG_RINGS) -#define NEXT_TX_BD(x) (((x) & (MAX_TX_DESC_CNT - 1)) ==			\ -		(MAX_TX_DESC_CNT - 1)) ?				\ +#define BNX2_NEXT_TX_BD(x) (((x) & (BNX2_MAX_TX_DESC_CNT - 1)) ==	\ +		(BNX2_MAX_TX_DESC_CNT - 1)) ?				\  	(x) + 2 : (x) + 1 -#define TX_RING_IDX(x) ((x) & MAX_TX_DESC_CNT) +#define BNX2_TX_RING_IDX(x) ((x) & BNX2_MAX_TX_DESC_CNT) -#define NEXT_RX_BD(x) (((x) & (MAX_RX_DESC_CNT - 1)) ==			\ -		(MAX_RX_DESC_CNT - 1)) ?				\ +#define BNX2_NEXT_RX_BD(x) (((x) & (BNX2_MAX_RX_DESC_CNT - 1)) ==	\ +		(BNX2_MAX_RX_DESC_CNT - 1)) ?				\  	(x) + 2 : (x) + 1 -#define RX_RING_IDX(x) ((x) & bp->rx_max_ring_idx) -#define RX_PG_RING_IDX(x) ((x) & bp->rx_max_pg_ring_idx) +#define BNX2_RX_RING_IDX(x) ((x) & bp->rx_max_ring_idx) +#define BNX2_RX_PG_RING_IDX(x) ((x) & bp->rx_max_pg_ring_idx) -#define RX_RING(x) (((x) & ~MAX_RX_DESC_CNT) >> (BCM_PAGE_BITS - 4)) -#define RX_IDX(x) ((x) & MAX_RX_DESC_CNT) +#define BNX2_RX_RING(x) (((x) & ~BNX2_MAX_RX_DESC_CNT) >> (BNX2_PAGE_BITS - 4)) +#define BNX2_RX_IDX(x) ((x) & BNX2_MAX_RX_DESC_CNT)  /* Context size. */  #define CTX_SHIFT                   7 @@ -6609,7 +6610,7 @@ struct l2_fhdr {   * RX ring buffer contains pointer to kmalloc() data only,   * skb are built only after Hardware filled the frame.   */ -struct sw_bd { +struct bnx2_sw_bd {  	u8			*data;  	DEFINE_DMA_UNMAP_ADDR(mapping);  }; @@ -6623,23 +6624,23 @@ static inline struct l2_fhdr *get_l2_fhdr(u8 *data)  } -struct sw_pg { +struct bnx2_sw_pg {  	struct page		*page;  	DEFINE_DMA_UNMAP_ADDR(mapping);  }; -struct sw_tx_bd { +struct bnx2_sw_tx_bd {  	struct sk_buff		*skb;  	DEFINE_DMA_UNMAP_ADDR(mapping);  	unsigned short		is_gso;  	unsigned short		nr_frags;  }; -#define SW_RXBD_RING_SIZE (sizeof(struct sw_bd) * RX_DESC_CNT) -#define SW_RXPG_RING_SIZE (sizeof(struct sw_pg) * RX_DESC_CNT) -#define RXBD_RING_SIZE (sizeof(struct rx_bd) * RX_DESC_CNT) -#define SW_TXBD_RING_SIZE (sizeof(struct sw_tx_bd) * TX_DESC_CNT) -#define TXBD_RING_SIZE (sizeof(struct tx_bd) * TX_DESC_CNT) +#define SW_RXBD_RING_SIZE (sizeof(struct bnx2_sw_bd) * BNX2_RX_DESC_CNT) +#define SW_RXPG_RING_SIZE (sizeof(struct bnx2_sw_pg) * BNX2_RX_DESC_CNT) +#define RXBD_RING_SIZE (sizeof(struct bnx2_rx_bd) * BNX2_RX_DESC_CNT) +#define SW_TXBD_RING_SIZE (sizeof(struct bnx2_sw_tx_bd) * BNX2_TX_DESC_CNT) +#define TXBD_RING_SIZE (sizeof(struct bnx2_tx_bd) * BNX2_TX_DESC_CNT)  /* Buffered flash (Atmel: AT45DB011B) specific information */  #define SEEPROM_PAGE_BITS			2 @@ -6720,8 +6721,8 @@ struct bnx2_tx_ring_info {  	u32			tx_bidx_addr;  	u32			tx_bseq_addr; -	struct tx_bd		*tx_desc_ring; -	struct sw_tx_bd		*tx_buf_ring; +	struct bnx2_tx_bd	*tx_desc_ring; +	struct bnx2_sw_tx_bd	*tx_buf_ring;  	u16			tx_cons;  	u16			hw_tx_cons; @@ -6741,13 +6742,13 @@ struct bnx2_rx_ring_info {  	u16			rx_pg_prod;  	u16			rx_pg_cons; -	struct sw_bd		*rx_buf_ring; -	struct rx_bd		*rx_desc_ring[MAX_RX_RINGS]; -	struct sw_pg		*rx_pg_ring; -	struct rx_bd		*rx_pg_desc_ring[MAX_RX_PG_RINGS]; +	struct bnx2_sw_bd	*rx_buf_ring; +	struct bnx2_rx_bd	*rx_desc_ring[BNX2_MAX_RX_RINGS]; +	struct bnx2_sw_pg	*rx_pg_ring; +	struct bnx2_rx_bd	*rx_pg_desc_ring[BNX2_MAX_RX_PG_RINGS]; -	dma_addr_t		rx_desc_mapping[MAX_RX_RINGS]; -	dma_addr_t		rx_pg_desc_mapping[MAX_RX_PG_RINGS]; +	dma_addr_t		rx_desc_mapping[BNX2_MAX_RX_RINGS]; +	dma_addr_t		rx_pg_desc_mapping[BNX2_MAX_RX_PG_RINGS];  };  struct bnx2_napi { @@ -6853,33 +6854,31 @@ struct bnx2 {  	u32			chip_id;  	/* chip num:16-31, rev:12-15, metal:4-11, bond_id:0-3 */ -#define CHIP_NUM(bp)			(((bp)->chip_id) & 0xffff0000) -#define CHIP_NUM_5706			0x57060000 -#define CHIP_NUM_5708			0x57080000 -#define CHIP_NUM_5709			0x57090000 - -#define CHIP_REV(bp)			(((bp)->chip_id) & 0x0000f000) -#define CHIP_REV_Ax			0x00000000 -#define CHIP_REV_Bx			0x00001000 -#define CHIP_REV_Cx			0x00002000 - -#define CHIP_METAL(bp)			(((bp)->chip_id) & 0x00000ff0) -#define CHIP_BONDING(bp)		(((bp)->chip_id) & 0x0000000f) - -#define CHIP_ID(bp)			(((bp)->chip_id) & 0xfffffff0) -#define CHIP_ID_5706_A0			0x57060000 -#define CHIP_ID_5706_A1			0x57060010 -#define CHIP_ID_5706_A2			0x57060020 -#define CHIP_ID_5708_A0			0x57080000 -#define CHIP_ID_5708_B0			0x57081000 -#define CHIP_ID_5708_B1			0x57081010 -#define CHIP_ID_5709_A0			0x57090000 -#define CHIP_ID_5709_A1			0x57090010 - -#define CHIP_BOND_ID(bp)		(((bp)->chip_id) & 0xf) +#define BNX2_CHIP(bp)			(((bp)->chip_id) & 0xffff0000) +#define BNX2_CHIP_5706			0x57060000 +#define BNX2_CHIP_5708			0x57080000 +#define BNX2_CHIP_5709			0x57090000 + +#define BNX2_CHIP_REV(bp)		(((bp)->chip_id) & 0x0000f000) +#define BNX2_CHIP_REV_Ax		0x00000000 +#define BNX2_CHIP_REV_Bx		0x00001000 +#define BNX2_CHIP_REV_Cx		0x00002000 + +#define BNX2_CHIP_METAL(bp)		(((bp)->chip_id) & 0x00000ff0) +#define BNX2_CHIP_BOND(bp)		(((bp)->chip_id) & 0x0000000f) + +#define BNX2_CHIP_ID(bp)		(((bp)->chip_id) & 0xfffffff0) +#define BNX2_CHIP_ID_5706_A0		0x57060000 +#define BNX2_CHIP_ID_5706_A1			0x57060010 +#define BNX2_CHIP_ID_5706_A2			0x57060020 +#define BNX2_CHIP_ID_5708_A0			0x57080000 +#define BNX2_CHIP_ID_5708_B0			0x57081000 +#define BNX2_CHIP_ID_5708_B1			0x57081010 +#define BNX2_CHIP_ID_5709_A0			0x57090000 +#define BNX2_CHIP_ID_5709_A1			0x57090010  /* A serdes chip will have the first bit of the bond id set. */ -#define CHIP_BOND_ID_SERDES_BIT		0x01 +#define BNX2_CHIP_BOND_SERDES_BIT		0x01  	u32			phy_addr;  	u32			phy_id; @@ -6985,19 +6984,20 @@ struct bnx2 {  #ifdef BCM_CNIC  	struct mutex		cnic_lock;  	struct cnic_eth_dev	cnic_eth_dev; +	struct cnic_eth_dev	*(*cnic_probe)(struct net_device *);  #endif  	const struct firmware	*mips_firmware;  	const struct firmware	*rv2p_firmware;  }; -#define REG_RD(bp, offset)					\ +#define BNX2_RD(bp, offset)					\  	readl(bp->regview + offset) -#define REG_WR(bp, offset, val)					\ +#define BNX2_WR(bp, offset, val)					\  	writel(val, bp->regview + offset) -#define REG_WR16(bp, offset, val)				\ +#define BNX2_WR16(bp, offset, val)				\  	writew(val, bp->regview + offset)  struct cpu_reg { @@ -7052,7 +7052,7 @@ struct bnx2_rv2p_fw_file {  #define RV2P_P1_FIXUP_PAGE_SIZE_IDX		0  #define RV2P_BD_PAGE_SIZE_MSK			0xffff -#define RV2P_BD_PAGE_SIZE			((BCM_PAGE_SIZE / 16) - 1) +#define RV2P_BD_PAGE_SIZE			((BNX2_PAGE_SIZE / 16) - 1)  #define RV2P_PROC1                              0  #define RV2P_PROC2                              1 diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index 72897c47b8c8..e8d4db10c8f3 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h @@ -34,25 +34,16 @@  #include "bnx2x_hsi.h" -#if defined(CONFIG_CNIC) || defined(CONFIG_CNIC_MODULE) -#define BCM_CNIC 1  #include "../cnic_if.h" -#endif -#ifdef BCM_CNIC -#define BNX2X_MIN_MSIX_VEC_CNT 3 -#define BNX2X_MSIX_VEC_FP_START 2 -#else -#define BNX2X_MIN_MSIX_VEC_CNT 2 -#define BNX2X_MSIX_VEC_FP_START 1 -#endif + +#define BNX2X_MIN_MSIX_VEC_CNT(bp)		((bp)->min_msix_vec_cnt)  #include <linux/mdio.h>  #include "bnx2x_reg.h"  #include "bnx2x_fw_defs.h"  #include "bnx2x_mfw_req.h" -#include "bnx2x_hsi.h"  #include "bnx2x_link.h"  #include "bnx2x_sp.h"  #include "bnx2x_dcb.h" @@ -256,15 +247,10 @@ enum {  	/* FCoE L2 */  #define	BNX2X_FCOE_ETH_CID(bp)		(BNX2X_CNIC_START_ETH_CID(bp) + 1) -/** Additional rings budgeting */ -#ifdef BCM_CNIC -#define CNIC_PRESENT			1 -#define FCOE_PRESENT			1 -#else -#define CNIC_PRESENT			0 -#define FCOE_PRESENT			0 -#endif /* BCM_CNIC */ -#define NON_ETH_CONTEXT_USE	(FCOE_PRESENT) +#define CNIC_SUPPORT(bp)		((bp)->cnic_support) +#define CNIC_ENABLED(bp)		((bp)->cnic_enabled) +#define CNIC_LOADED(bp)			((bp)->cnic_loaded) +#define FCOE_INIT(bp)			((bp)->fcoe_init)  #define AEU_IN_ATTN_BITS_PXPPCICLOCKCLIENT_PARITY_ERROR \  	AEU_INPUTS_ATTN_BITS_PXPPCICLOCKCLIENT_PARITY_ERROR @@ -297,9 +283,7 @@ enum {  	OOO_TXQ_IDX_OFFSET,  };  #define MAX_ETH_TXQ_IDX(bp)	(BNX2X_NUM_NON_CNIC_QUEUES(bp) * (bp)->max_cos) -#ifdef BCM_CNIC  #define FCOE_TXQ_IDX(bp)	(MAX_ETH_TXQ_IDX(bp) + FCOE_TXQ_IDX_OFFSET) -#endif  /* fast path */  /* @@ -505,7 +489,7 @@ struct bnx2x_fastpath {  	u32			ustorm_rx_prods_offset;  	u32			rx_buf_size; - +	u32			rx_frag_size; /* 0 if kmalloced(), or rx_buf_size + NET_SKB_PAD */  	dma_addr_t		status_blk_mapping;  	enum bnx2x_tpa_mode_t	mode; @@ -585,15 +569,9 @@ struct bnx2x_fastpath {  						->var) -#define IS_ETH_FP(fp)			(fp->index < \ -					 BNX2X_NUM_ETH_QUEUES(fp->bp)) -#ifdef BCM_CNIC -#define IS_FCOE_FP(fp)			(fp->index == FCOE_IDX(fp->bp)) -#define IS_FCOE_IDX(idx)		((idx) == FCOE_IDX(bp)) -#else -#define IS_FCOE_FP(fp)		false -#define IS_FCOE_IDX(idx)	false -#endif +#define IS_ETH_FP(fp)		((fp)->index < BNX2X_NUM_ETH_QUEUES((fp)->bp)) +#define IS_FCOE_FP(fp)		((fp)->index == FCOE_IDX((fp)->bp)) +#define IS_FCOE_IDX(idx)	((idx) == FCOE_IDX(bp))  /* MC hsi */ @@ -886,6 +864,18 @@ struct bnx2x_common {  					 (CHIP_REV(bp) == CHIP_REV_Bx))  #define CHIP_IS_E3A0(bp)		(CHIP_IS_E3(bp) && \  					 (CHIP_REV(bp) == CHIP_REV_Ax)) +/* This define is used in two main places: + * 1. In the early stages of nic_load, to know if to configrue Parser / Searcher + * to nic-only mode or to offload mode. Offload mode is configured if either the + * chip is E1x (where MIC_MODE register is not applicable), or if cnic already + * registered for this port (which means that the user wants storage services). + * 2. During cnic-related load, to know if offload mode is already configured in + * the HW or needs to be configrued. + * Since the transition from nic-mode to offload-mode in HW causes traffic + * coruption, nic-mode is configured only in ports on which storage services + * where never requested. + */ +#define CONFIGURE_NIC_MODE(bp)		(!CHIP_IS_E1x(bp) && !CNIC_ENABLED(bp))  	int			flash_size;  #define BNX2X_NVRAM_1MB_SIZE			0x20000	/* 1M bit in bytes */ @@ -925,6 +915,7 @@ struct bnx2x_common {  #define BNX2X_IGU_STAS_MSG_VF_CNT 64  #define BNX2X_IGU_STAS_MSG_PF_CNT 4 +#define MAX_IGU_ATTN_ACK_TO       100  /* end of common */  /* port */ @@ -946,7 +937,6 @@ struct bnx2x_port {  	/* used to synchronize phy accesses */  	struct mutex		phy_mutex; -	int			need_hw_lock;  	u32			port_stx; @@ -1003,18 +993,15 @@ union cdu_context {  #define CDU_ILT_PAGE_SZ		(8192 << CDU_ILT_PAGE_SZ_HW) /* 32K */  #define ILT_PAGE_CIDS		(CDU_ILT_PAGE_SZ / sizeof(union cdu_context)) -#ifdef BCM_CNIC  #define CNIC_ISCSI_CID_MAX	256  #define CNIC_FCOE_CID_MAX	2048  #define CNIC_CID_MAX		(CNIC_ISCSI_CID_MAX + CNIC_FCOE_CID_MAX)  #define CNIC_ILT_LINES		DIV_ROUND_UP(CNIC_CID_MAX, ILT_PAGE_CIDS) -#endif  #define QM_ILT_PAGE_SZ_HW	0  #define QM_ILT_PAGE_SZ		(4096 << QM_ILT_PAGE_SZ_HW) /* 4K */  #define QM_CID_ROUND		1024 -#ifdef BCM_CNIC  /* TM (timers) host DB constants */  #define TM_ILT_PAGE_SZ_HW	0  #define TM_ILT_PAGE_SZ		(4096 << TM_ILT_PAGE_SZ_HW) /* 4K */ @@ -1032,8 +1019,6 @@ union cdu_context {  #define SRC_T2_SZ		SRC_ILT_SZ  #define SRC_ILT_LINES		DIV_ROUND_UP(SRC_ILT_SZ, SRC_ILT_PAGE_SZ) -#endif -  #define MAX_DMAE_C		8  /* DMA memory not used in fastpath */ @@ -1201,6 +1186,7 @@ struct bnx2x_prev_path_list {  	u8 slot;  	u8 path;  	struct list_head list; +	u8 undi;  };  struct bnx2x_sp_objs { @@ -1227,7 +1213,6 @@ struct bnx2x {  	struct bnx2x_sp_objs	*sp_objs;  	struct bnx2x_fp_stats	*fp_stats;  	struct bnx2x_fp_txdata	*bnx2x_txq; -	int			bnx2x_txq_size;  	void __iomem		*regview;  	void __iomem		*doorbells;  	u16			db_size; @@ -1350,6 +1335,16 @@ struct bnx2x {  #define NO_ISCSI_OOO(bp)	((bp)->flags & NO_ISCSI_OOO_FLAG)  #define NO_FCOE(bp)		((bp)->flags & NO_FCOE_FLAG) +	u8			cnic_support; +	bool			cnic_enabled; +	bool			cnic_loaded; +	struct cnic_eth_dev	*(*cnic_probe)(struct net_device *); + +	/* Flag that indicates that we can start looking for FCoE L2 queue +	 * completions in the default status block. +	 */ +	bool			fcoe_init; +  	int			pm_cap;  	int			mrrs; @@ -1420,6 +1415,8 @@ struct bnx2x {  #define BNX2X_MAX_COS			3  #define BNX2X_MAX_TX_COS		2  	int			num_queues; +	uint			num_ethernet_queues; +	uint			num_cnic_queues;  	int			num_napi_queues;  	int			disable_tpa; @@ -1433,6 +1430,7 @@ struct bnx2x {  	u8			igu_dsb_id;  	u8			igu_base_sb;  	u8			igu_sb_cnt; +	u8			min_msix_vec_cnt;  	dma_addr_t		def_status_blk_mapping; @@ -1478,26 +1476,23 @@ struct bnx2x {   * Maximum supported number of RSS queues: number of IGU SBs minus one that goes   * to CNIC.   */ -#define BNX2X_MAX_RSS_COUNT(bp)	((bp)->igu_sb_cnt - CNIC_PRESENT) +#define BNX2X_MAX_RSS_COUNT(bp)	((bp)->igu_sb_cnt - CNIC_SUPPORT(bp))  /*   * Maximum CID count that might be required by the bnx2x:   * Max RSS * Max_Tx_Multi_Cos + FCoE + iSCSI   */  #define BNX2X_L2_CID_COUNT(bp)	(BNX2X_NUM_ETH_QUEUES(bp) * BNX2X_MULTI_TX_COS \ -				+ NON_ETH_CONTEXT_USE + CNIC_PRESENT) +				+ 2 * CNIC_SUPPORT(bp))  #define BNX2X_L2_MAX_CID(bp)	(BNX2X_MAX_RSS_COUNT(bp) * BNX2X_MULTI_TX_COS \ -				+ NON_ETH_CONTEXT_USE + CNIC_PRESENT) +				+ 2 * CNIC_SUPPORT(bp))  #define L2_ILT_LINES(bp)	(DIV_ROUND_UP(BNX2X_L2_CID_COUNT(bp),\  					ILT_PAGE_CIDS))  	int			qm_cid_count; -	int			dropless_fc; +	bool			dropless_fc; -#ifdef BCM_CNIC -	u32			cnic_flags; -#define BNX2X_CNIC_FLAG_MAC_SET		1  	void			*t2;  	dma_addr_t		t2_mapping;  	struct cnic_ops	__rcu	*cnic_ops; @@ -1518,7 +1513,6 @@ struct bnx2x {  	/* Start index of the "special" (CNIC related) L2 cleints */  	u8				cnic_base_cl_id; -#endif  	int			dmae_ready;  	/* used to synchronize dmae accesses */ @@ -1647,9 +1641,9 @@ struct bnx2x {  /* Tx queues may be less or equal to Rx queues */  extern int num_queues;  #define BNX2X_NUM_QUEUES(bp)	(bp->num_queues) -#define BNX2X_NUM_ETH_QUEUES(bp) (BNX2X_NUM_QUEUES(bp) - NON_ETH_CONTEXT_USE) +#define BNX2X_NUM_ETH_QUEUES(bp) ((bp)->num_ethernet_queues)  #define BNX2X_NUM_NON_CNIC_QUEUES(bp)	(BNX2X_NUM_QUEUES(bp) - \ -					 NON_ETH_CONTEXT_USE) +					 (bp)->num_cnic_queues)  #define BNX2X_NUM_RX_QUEUES(bp)	BNX2X_NUM_QUEUES(bp)  #define is_multi(bp)		(BNX2X_NUM_QUEUES(bp) > 1) @@ -1689,6 +1683,13 @@ struct bnx2x_func_init_params {  	u16		spq_prod;	/* valid iff FUNC_FLG_SPQ */  }; +#define for_each_cnic_queue(bp, var) \ +	for ((var) = BNX2X_NUM_ETH_QUEUES(bp); (var) < BNX2X_NUM_QUEUES(bp); \ +	     (var)++) \ +		if (skip_queue(bp, var))	\ +			continue;		\ +		else +  #define for_each_eth_queue(bp, var) \  	for ((var) = 0; (var) < BNX2X_NUM_ETH_QUEUES(bp); (var)++) @@ -1702,6 +1703,22 @@ struct bnx2x_func_init_params {  		else  /* Skip forwarding FP */ +#define for_each_valid_rx_queue(bp, var)			\ +	for ((var) = 0;						\ +	     (var) < (CNIC_LOADED(bp) ? BNX2X_NUM_QUEUES(bp) :	\ +		      BNX2X_NUM_ETH_QUEUES(bp));		\ +	     (var)++)						\ +		if (skip_rx_queue(bp, var))			\ +			continue;				\ +		else + +#define for_each_rx_queue_cnic(bp, var) \ +	for ((var) = BNX2X_NUM_ETH_QUEUES(bp); (var) < BNX2X_NUM_QUEUES(bp); \ +	     (var)++) \ +		if (skip_rx_queue(bp, var))	\ +			continue;		\ +		else +  #define for_each_rx_queue(bp, var) \  	for ((var) = 0; (var) < BNX2X_NUM_QUEUES(bp); (var)++) \  		if (skip_rx_queue(bp, var))	\ @@ -1709,6 +1726,22 @@ struct bnx2x_func_init_params {  		else  /* Skip OOO FP */ +#define for_each_valid_tx_queue(bp, var)			\ +	for ((var) = 0;						\ +	     (var) < (CNIC_LOADED(bp) ? BNX2X_NUM_QUEUES(bp) :	\ +		      BNX2X_NUM_ETH_QUEUES(bp));		\ +	     (var)++)						\ +		if (skip_tx_queue(bp, var))			\ +			continue;				\ +		else + +#define for_each_tx_queue_cnic(bp, var) \ +	for ((var) = BNX2X_NUM_ETH_QUEUES(bp); (var) < BNX2X_NUM_QUEUES(bp); \ +	     (var)++) \ +		if (skip_tx_queue(bp, var))	\ +			continue;		\ +		else +  #define for_each_tx_queue(bp, var) \  	for ((var) = 0; (var) < BNX2X_NUM_QUEUES(bp); (var)++) \  		if (skip_tx_queue(bp, var))	\ @@ -2179,7 +2212,6 @@ void bnx2x_notify_link_changed(struct bnx2x *bp);  #define BNX2X_MF_SD_PROTOCOL(bp) \  	((bp)->mf_config[BP_VN(bp)] & FUNC_MF_CFG_PROTOCOL_MASK) -#ifdef BCM_CNIC  #define BNX2X_IS_MF_SD_PROTOCOL_ISCSI(bp) \  	(BNX2X_MF_SD_PROTOCOL(bp) == FUNC_MF_CFG_PROTOCOL_ISCSI) @@ -2196,9 +2228,12 @@ void bnx2x_notify_link_changed(struct bnx2x *bp);  #define IS_MF_STORAGE_SD(bp) (IS_MF_SD(bp) && \  				(BNX2X_IS_MF_SD_PROTOCOL_ISCSI(bp) || \  				 BNX2X_IS_MF_SD_PROTOCOL_FCOE(bp))) -#else -#define IS_MF_FCOE_AFEX(bp)	false -#endif +enum { +	SWITCH_UPDATE, +	AFEX_UPDATE, +}; + +#define NUM_MACS	8  #endif /* bnx2x.h */ diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 4833b6a9031c..01588b66a38c 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c @@ -552,6 +552,23 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,  	return 0;  } +static void bnx2x_frag_free(const struct bnx2x_fastpath *fp, void *data) +{ +	if (fp->rx_frag_size) +		put_page(virt_to_head_page(data)); +	else +		kfree(data); +} + +static void *bnx2x_frag_alloc(const struct bnx2x_fastpath *fp) +{ +	if (fp->rx_frag_size) +		return netdev_alloc_frag(fp->rx_frag_size); + +	return kmalloc(fp->rx_buf_size + NET_SKB_PAD, GFP_ATOMIC); +} + +  static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,  			   struct bnx2x_agg_info *tpa_info,  			   u16 pages, @@ -574,15 +591,14 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,  		goto drop;  	/* Try to allocate the new data */ -	new_data = kmalloc(fp->rx_buf_size + NET_SKB_PAD, GFP_ATOMIC); - +	new_data = bnx2x_frag_alloc(fp);  	/* Unmap skb in the pool anyway, as we are going to change  	   pool entry status to BNX2X_TPA_STOP even if new skb allocation  	   fails. */  	dma_unmap_single(&bp->pdev->dev, dma_unmap_addr(rx_buf, mapping),  			 fp->rx_buf_size, DMA_FROM_DEVICE);  	if (likely(new_data)) -		skb = build_skb(data, 0); +		skb = build_skb(data, fp->rx_frag_size);  	if (likely(skb)) {  #ifdef BNX2X_STOP_ON_ERROR @@ -619,7 +635,7 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,  		return;  	} -	kfree(new_data); +	bnx2x_frag_free(fp, new_data);  drop:  	/* drop the packet and keep the buffer in the bin */  	DP(NETIF_MSG_RX_STATUS, @@ -635,7 +651,7 @@ static int bnx2x_alloc_rx_data(struct bnx2x *bp,  	struct eth_rx_bd *rx_bd = &fp->rx_desc_ring[index];  	dma_addr_t mapping; -	data = kmalloc(fp->rx_buf_size + NET_SKB_PAD, GFP_ATOMIC); +	data = bnx2x_frag_alloc(fp);  	if (unlikely(data == NULL))  		return -ENOMEM; @@ -643,7 +659,7 @@ static int bnx2x_alloc_rx_data(struct bnx2x *bp,  				 fp->rx_buf_size,  				 DMA_FROM_DEVICE);  	if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) { -		kfree(data); +		bnx2x_frag_free(fp, data);  		BNX2X_ERR("Can't map rx data\n");  		return -ENOMEM;  	} @@ -845,9 +861,9 @@ int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget)  						 dma_unmap_addr(rx_buf, mapping),  						 fp->rx_buf_size,  						 DMA_FROM_DEVICE); -				skb = build_skb(data, 0); +				skb = build_skb(data, fp->rx_frag_size);  				if (unlikely(!skb)) { -					kfree(data); +					bnx2x_frag_free(fp, data);  					bnx2x_fp_qstats(bp, fp)->  							rx_skb_alloc_failed++;  					goto next_rx; @@ -948,14 +964,12 @@ void bnx2x_acquire_phy_lock(struct bnx2x *bp)  {  	mutex_lock(&bp->port.phy_mutex); -	if (bp->port.need_hw_lock) -		bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_MDIO); +	bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_MDIO);  }  void bnx2x_release_phy_lock(struct bnx2x *bp)  { -	if (bp->port.need_hw_lock) -		bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_MDIO); +	bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_MDIO);  	mutex_unlock(&bp->port.phy_mutex);  } @@ -1147,11 +1161,30 @@ static void bnx2x_free_tpa_pool(struct bnx2x *bp,  			dma_unmap_single(&bp->pdev->dev,  					 dma_unmap_addr(first_buf, mapping),  					 fp->rx_buf_size, DMA_FROM_DEVICE); -		kfree(data); +		bnx2x_frag_free(fp, data);  		first_buf->data = NULL;  	}  } +void bnx2x_init_rx_rings_cnic(struct bnx2x *bp) +{ +	int j; + +	for_each_rx_queue_cnic(bp, j) { +		struct bnx2x_fastpath *fp = &bp->fp[j]; + +		fp->rx_bd_cons = 0; + +		/* Activate BD ring */ +		/* Warning! +		 * this will generate an interrupt (to the TSTORM) +		 * must only be done after chip is initialized +		 */ +		bnx2x_update_rx_prod(bp, fp, fp->rx_bd_prod, fp->rx_comp_prod, +				     fp->rx_sge_prod); +	} +} +  void bnx2x_init_rx_rings(struct bnx2x *bp)  {  	int func = BP_FUNC(bp); @@ -1159,7 +1192,7 @@ void bnx2x_init_rx_rings(struct bnx2x *bp)  	int i, j;  	/* Allocate TPA resources */ -	for_each_rx_queue(bp, j) { +	for_each_eth_queue(bp, j) {  		struct bnx2x_fastpath *fp = &bp->fp[j];  		DP(NETIF_MSG_IFUP, @@ -1173,8 +1206,7 @@ void bnx2x_init_rx_rings(struct bnx2x *bp)  				struct sw_rx_bd *first_buf =  					&tpa_info->first_buf; -				first_buf->data = kmalloc(fp->rx_buf_size + NET_SKB_PAD, -							  GFP_ATOMIC); +				first_buf->data = bnx2x_frag_alloc(fp);  				if (!first_buf->data) {  					BNX2X_ERR("Failed to allocate TPA skb pool for queue[%d] - disabling TPA on this queue!\n",  						  j); @@ -1217,7 +1249,7 @@ void bnx2x_init_rx_rings(struct bnx2x *bp)  		}  	} -	for_each_rx_queue(bp, j) { +	for_each_eth_queue(bp, j) {  		struct bnx2x_fastpath *fp = &bp->fp[j];  		fp->rx_bd_cons = 0; @@ -1244,29 +1276,45 @@ void bnx2x_init_rx_rings(struct bnx2x *bp)  	}  } -static void bnx2x_free_tx_skbs(struct bnx2x *bp) +static void bnx2x_free_tx_skbs_queue(struct bnx2x_fastpath *fp)  { -	int i;  	u8 cos; +	struct bnx2x *bp = fp->bp; -	for_each_tx_queue(bp, i) { -		struct bnx2x_fastpath *fp = &bp->fp[i]; -		for_each_cos_in_tx_queue(fp, cos) { -			struct bnx2x_fp_txdata *txdata = fp->txdata_ptr[cos]; -			unsigned pkts_compl = 0, bytes_compl = 0; +	for_each_cos_in_tx_queue(fp, cos) { +		struct bnx2x_fp_txdata *txdata = fp->txdata_ptr[cos]; +		unsigned pkts_compl = 0, bytes_compl = 0; -			u16 sw_prod = txdata->tx_pkt_prod; -			u16 sw_cons = txdata->tx_pkt_cons; +		u16 sw_prod = txdata->tx_pkt_prod; +		u16 sw_cons = txdata->tx_pkt_cons; -			while (sw_cons != sw_prod) { -				bnx2x_free_tx_pkt(bp, txdata, TX_BD(sw_cons), -				    &pkts_compl, &bytes_compl); -				sw_cons++; -			} -			netdev_tx_reset_queue( -				netdev_get_tx_queue(bp->dev, -						    txdata->txq_index)); +		while (sw_cons != sw_prod) { +			bnx2x_free_tx_pkt(bp, txdata, TX_BD(sw_cons), +					  &pkts_compl, &bytes_compl); +			sw_cons++;  		} + +		netdev_tx_reset_queue( +			netdev_get_tx_queue(bp->dev, +					    txdata->txq_index)); +	} +} + +static void bnx2x_free_tx_skbs_cnic(struct bnx2x *bp) +{ +	int i; + +	for_each_tx_queue_cnic(bp, i) { +		bnx2x_free_tx_skbs_queue(&bp->fp[i]); +	} +} + +static void bnx2x_free_tx_skbs(struct bnx2x *bp) +{ +	int i; + +	for_each_eth_queue(bp, i) { +		bnx2x_free_tx_skbs_queue(&bp->fp[i]);  	}  } @@ -1290,7 +1338,16 @@ static void bnx2x_free_rx_bds(struct bnx2x_fastpath *fp)  				 fp->rx_buf_size, DMA_FROM_DEVICE);  		rx_buf->data = NULL; -		kfree(data); +		bnx2x_frag_free(fp, data); +	} +} + +static void bnx2x_free_rx_skbs_cnic(struct bnx2x *bp) +{ +	int j; + +	for_each_rx_queue_cnic(bp, j) { +		bnx2x_free_rx_bds(&bp->fp[j]);  	}  } @@ -1298,7 +1355,7 @@ static void bnx2x_free_rx_skbs(struct bnx2x *bp)  {  	int j; -	for_each_rx_queue(bp, j) { +	for_each_eth_queue(bp, j) {  		struct bnx2x_fastpath *fp = &bp->fp[j];  		bnx2x_free_rx_bds(fp); @@ -1308,6 +1365,12 @@ static void bnx2x_free_rx_skbs(struct bnx2x *bp)  	}  } +void bnx2x_free_skbs_cnic(struct bnx2x *bp) +{ +	bnx2x_free_tx_skbs_cnic(bp); +	bnx2x_free_rx_skbs_cnic(bp); +} +  void bnx2x_free_skbs(struct bnx2x *bp)  {  	bnx2x_free_tx_skbs(bp); @@ -1347,11 +1410,12 @@ static void bnx2x_free_msix_irqs(struct bnx2x *bp, int nvecs)  	DP(NETIF_MSG_IFDOWN, "released sp irq (%d)\n",  	   bp->msix_table[offset].vector);  	offset++; -#ifdef BCM_CNIC -	if (nvecs == offset) -		return; -	offset++; -#endif + +	if (CNIC_SUPPORT(bp)) { +		if (nvecs == offset) +			return; +		offset++; +	}  	for_each_eth_queue(bp, i) {  		if (nvecs == offset) @@ -1368,7 +1432,7 @@ void bnx2x_free_irq(struct bnx2x *bp)  	if (bp->flags & USING_MSIX_FLAG &&  	    !(bp->flags & USING_SINGLE_MSIX_FLAG))  		bnx2x_free_msix_irqs(bp, BNX2X_NUM_ETH_QUEUES(bp) + -				     CNIC_PRESENT + 1); +				     CNIC_SUPPORT(bp) + 1);  	else  		free_irq(bp->dev->irq, bp->dev);  } @@ -1382,12 +1446,14 @@ int bnx2x_enable_msix(struct bnx2x *bp)  	   bp->msix_table[0].entry);  	msix_vec++; -#ifdef BCM_CNIC -	bp->msix_table[msix_vec].entry = msix_vec; -	BNX2X_DEV_INFO("msix_table[%d].entry = %d (CNIC)\n", -	   bp->msix_table[msix_vec].entry, bp->msix_table[msix_vec].entry); -	msix_vec++; -#endif +	/* Cnic requires an msix vector for itself */ +	if (CNIC_SUPPORT(bp)) { +		bp->msix_table[msix_vec].entry = msix_vec; +		BNX2X_DEV_INFO("msix_table[%d].entry = %d (CNIC)\n", +			       msix_vec, bp->msix_table[msix_vec].entry); +		msix_vec++; +	} +  	/* We need separate vectors for ETH queues only (not FCoE) */  	for_each_eth_queue(bp, i) {  		bp->msix_table[msix_vec].entry = msix_vec; @@ -1396,7 +1462,7 @@ int bnx2x_enable_msix(struct bnx2x *bp)  		msix_vec++;  	} -	req_cnt = BNX2X_NUM_ETH_QUEUES(bp) + CNIC_PRESENT + 1; +	req_cnt = BNX2X_NUM_ETH_QUEUES(bp) + CNIC_SUPPORT(bp) + 1;  	rc = pci_enable_msix(bp->pdev, &bp->msix_table[0], req_cnt); @@ -1404,7 +1470,7 @@ int bnx2x_enable_msix(struct bnx2x *bp)  	 * reconfigure number of tx/rx queues according to available  	 * MSI-X vectors  	 */ -	if (rc >= BNX2X_MIN_MSIX_VEC_CNT) { +	if (rc >= BNX2X_MIN_MSIX_VEC_CNT(bp)) {  		/* how less vectors we will have? */  		int diff = req_cnt - rc; @@ -1419,7 +1485,8 @@ int bnx2x_enable_msix(struct bnx2x *bp)  		/*  		 * decrease number of queues by number of unallocated entries  		 */ -		bp->num_queues -= diff; +		bp->num_ethernet_queues -= diff; +		bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues;  		BNX2X_DEV_INFO("New queue configuration set: %d\n",  			       bp->num_queues); @@ -1435,6 +1502,9 @@ int bnx2x_enable_msix(struct bnx2x *bp)  		BNX2X_DEV_INFO("Using single MSI-X vector\n");  		bp->flags |= USING_SINGLE_MSIX_FLAG; +		BNX2X_DEV_INFO("set number of queues to 1\n"); +		bp->num_ethernet_queues = 1; +		bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues;  	} else if (rc < 0) {  		BNX2X_DEV_INFO("MSI-X is not attainable  rc %d\n", rc);  		goto no_msix; @@ -1464,9 +1534,9 @@ static int bnx2x_req_msix_irqs(struct bnx2x *bp)  		return -EBUSY;  	} -#ifdef BCM_CNIC -	offset++; -#endif +	if (CNIC_SUPPORT(bp)) +		offset++; +  	for_each_eth_queue(bp, i) {  		struct bnx2x_fastpath *fp = &bp->fp[i];  		snprintf(fp->name, sizeof(fp->name), "%s-fp-%d", @@ -1485,7 +1555,7 @@ static int bnx2x_req_msix_irqs(struct bnx2x *bp)  	}  	i = BNX2X_NUM_ETH_QUEUES(bp); -	offset = 1 + CNIC_PRESENT; +	offset = 1 + CNIC_SUPPORT(bp);  	netdev_info(bp->dev, "using MSI-X  IRQs: sp %d  fp[%d] %d ... fp[%d] %d\n",  	       bp->msix_table[0].vector,  	       0, bp->msix_table[offset].vector, @@ -1556,19 +1626,35 @@ static int bnx2x_setup_irqs(struct bnx2x *bp)  	return 0;  } +static void bnx2x_napi_enable_cnic(struct bnx2x *bp) +{ +	int i; + +	for_each_rx_queue_cnic(bp, i) +		napi_enable(&bnx2x_fp(bp, i, napi)); +} +  static void bnx2x_napi_enable(struct bnx2x *bp)  {  	int i; -	for_each_rx_queue(bp, i) +	for_each_eth_queue(bp, i)  		napi_enable(&bnx2x_fp(bp, i, napi));  } +static void bnx2x_napi_disable_cnic(struct bnx2x *bp) +{ +	int i; + +	for_each_rx_queue_cnic(bp, i) +		napi_disable(&bnx2x_fp(bp, i, napi)); +} +  static void bnx2x_napi_disable(struct bnx2x *bp)  {  	int i; -	for_each_rx_queue(bp, i) +	for_each_eth_queue(bp, i)  		napi_disable(&bnx2x_fp(bp, i, napi));  } @@ -1576,6 +1662,8 @@ void bnx2x_netif_start(struct bnx2x *bp)  {  	if (netif_running(bp->dev)) {  		bnx2x_napi_enable(bp); +		if (CNIC_LOADED(bp)) +			bnx2x_napi_enable_cnic(bp);  		bnx2x_int_enable(bp);  		if (bp->state == BNX2X_STATE_OPEN)  			netif_tx_wake_all_queues(bp->dev); @@ -1586,14 +1674,15 @@ void bnx2x_netif_stop(struct bnx2x *bp, int disable_hw)  {  	bnx2x_int_disable_sync(bp, disable_hw);  	bnx2x_napi_disable(bp); +	if (CNIC_LOADED(bp)) +		bnx2x_napi_disable_cnic(bp);  }  u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb)  {  	struct bnx2x *bp = netdev_priv(dev); -#ifdef BCM_CNIC -	if (!NO_FCOE(bp)) { +	if (CNIC_LOADED(bp) && !NO_FCOE(bp)) {  		struct ethhdr *hdr = (struct ethhdr *)skb->data;  		u16 ether_type = ntohs(hdr->h_proto); @@ -1609,7 +1698,7 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb)  		if ((ether_type == ETH_P_FCOE) || (ether_type == ETH_P_FIP))  			return bnx2x_fcoe_tx(bp, txq_index);  	} -#endif +  	/* select a non-FCoE queue */  	return __skb_tx_hash(dev, skb, BNX2X_NUM_ETH_QUEUES(bp));  } @@ -1618,15 +1707,15 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb)  void bnx2x_set_num_queues(struct bnx2x *bp)  {  	/* RSS queues */ -	bp->num_queues = bnx2x_calc_num_queues(bp); +	bp->num_ethernet_queues = bnx2x_calc_num_queues(bp); -#ifdef BCM_CNIC  	/* override in STORAGE SD modes */  	if (IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp)) -		bp->num_queues = 1; -#endif +		bp->num_ethernet_queues = 1; +  	/* Add special queues */ -	bp->num_queues += NON_ETH_CONTEXT_USE; +	bp->num_cnic_queues = CNIC_SUPPORT(bp); /* For FCOE */ +	bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues;  	BNX2X_DEV_INFO("set number of queues to %d\n", bp->num_queues);  } @@ -1653,20 +1742,18 @@ void bnx2x_set_num_queues(struct bnx2x *bp)   * bnx2x_setup_tc() takes care of the proper TC mappings so that __skb_tx_hash()   * will return a proper Tx index if TC is enabled (netdev->num_tc > 0).   */ -static int bnx2x_set_real_num_queues(struct bnx2x *bp) +static int bnx2x_set_real_num_queues(struct bnx2x *bp, int include_cnic)  {  	int rc, tx, rx;  	tx = BNX2X_NUM_ETH_QUEUES(bp) * bp->max_cos; -	rx = BNX2X_NUM_QUEUES(bp) - NON_ETH_CONTEXT_USE; +	rx = BNX2X_NUM_ETH_QUEUES(bp);  /* account for fcoe queue */ -#ifdef BCM_CNIC -	if (!NO_FCOE(bp)) { -		rx += FCOE_PRESENT; -		tx += FCOE_PRESENT; +	if (include_cnic && !NO_FCOE(bp)) { +		rx++; +		tx++;  	} -#endif  	rc = netif_set_real_num_tx_queues(bp->dev, tx);  	if (rc) { @@ -1710,6 +1797,10 @@ static void bnx2x_set_rx_buf_size(struct bnx2x *bp)  				  mtu +  				  BNX2X_FW_RX_ALIGN_END;  		/* Note : rx_buf_size doesnt take into account NET_SKB_PAD */ +		if (fp->rx_buf_size + NET_SKB_PAD <= PAGE_SIZE) +			fp->rx_frag_size = fp->rx_buf_size + NET_SKB_PAD; +		else +			fp->rx_frag_size = 0;  	}  } @@ -1741,7 +1832,6 @@ int bnx2x_config_rss_pf(struct bnx2x *bp, struct bnx2x_rss_config_obj *rss_obj,  			bool config_hash)  {  	struct bnx2x_config_rss_params params = {NULL}; -	int i;  	/* Although RSS is meaningless when there is a single HW queue we  	 * still need it enabled in order to have HW Rx hash generated. @@ -1773,9 +1863,7 @@ int bnx2x_config_rss_pf(struct bnx2x *bp, struct bnx2x_rss_config_obj *rss_obj,  	if (config_hash) {  		/* RSS keys */ -		for (i = 0; i < sizeof(params.rss_key) / 4; i++) -			params.rss_key[i] = random32(); - +		prandom_bytes(params.rss_key, sizeof(params.rss_key));  		__set_bit(BNX2X_RSS_SET_SRCH, ¶ms.rss_flags);  	} @@ -1859,14 +1947,26 @@ static void bnx2x_squeeze_objects(struct bnx2x *bp)  		(bp)->state = BNX2X_STATE_ERROR; \  		goto label; \  	} while (0) -#else + +#define LOAD_ERROR_EXIT_CNIC(bp, label) \ +	do { \ +		bp->cnic_loaded = false; \ +		goto label; \ +	} while (0) +#else /*BNX2X_STOP_ON_ERROR*/  #define LOAD_ERROR_EXIT(bp, label) \  	do { \  		(bp)->state = BNX2X_STATE_ERROR; \  		(bp)->panic = 1; \  		return -EBUSY; \  	} while (0) -#endif +#define LOAD_ERROR_EXIT_CNIC(bp, label) \ +	do { \ +		bp->cnic_loaded = false; \ +		(bp)->panic = 1; \ +		return -EBUSY; \ +	} while (0) +#endif /*BNX2X_STOP_ON_ERROR*/  bool bnx2x_test_firmware_version(struct bnx2x *bp, bool is_err)  { @@ -1959,10 +2059,8 @@ static void bnx2x_bz_fp(struct bnx2x *bp, int index)  		fp->max_cos = 1;  	/* Init txdata pointers */ -#ifdef BCM_CNIC  	if (IS_FCOE_FP(fp))  		fp->txdata_ptr[0] = &bp->bnx2x_txq[FCOE_TXQ_IDX(bp)]; -#endif  	if (IS_ETH_FP(fp))  		for_each_cos_in_tx_queue(fp, cos)  			fp->txdata_ptr[cos] = &bp->bnx2x_txq[cos * @@ -1980,11 +2078,95 @@ static void bnx2x_bz_fp(struct bnx2x *bp, int index)  	else if (bp->flags & GRO_ENABLE_FLAG)  		fp->mode = TPA_MODE_GRO; -#ifdef BCM_CNIC  	/* We don't want TPA on an FCoE L2 ring */  	if (IS_FCOE_FP(fp))  		fp->disable_tpa = 1; -#endif +} + +int bnx2x_load_cnic(struct bnx2x *bp) +{ +	int i, rc, port = BP_PORT(bp); + +	DP(NETIF_MSG_IFUP, "Starting CNIC-related load\n"); + +	mutex_init(&bp->cnic_mutex); + +	rc = bnx2x_alloc_mem_cnic(bp); +	if (rc) { +		BNX2X_ERR("Unable to allocate bp memory for cnic\n"); +		LOAD_ERROR_EXIT_CNIC(bp, load_error_cnic0); +	} + +	rc = bnx2x_alloc_fp_mem_cnic(bp); +	if (rc) { +		BNX2X_ERR("Unable to allocate memory for cnic fps\n"); +		LOAD_ERROR_EXIT_CNIC(bp, load_error_cnic0); +	} + +	/* Update the number of queues with the cnic queues */ +	rc = bnx2x_set_real_num_queues(bp, 1); +	if (rc) { +		BNX2X_ERR("Unable to set real_num_queues including cnic\n"); +		LOAD_ERROR_EXIT_CNIC(bp, load_error_cnic0); +	} + +	/* Add all CNIC NAPI objects */ +	bnx2x_add_all_napi_cnic(bp); +	DP(NETIF_MSG_IFUP, "cnic napi added\n"); +	bnx2x_napi_enable_cnic(bp); + +	rc = bnx2x_init_hw_func_cnic(bp); +	if (rc) +		LOAD_ERROR_EXIT_CNIC(bp, load_error_cnic1); + +	bnx2x_nic_init_cnic(bp); + +	/* Enable Timer scan */ +	REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 1); + +	for_each_cnic_queue(bp, i) { +		rc = bnx2x_setup_queue(bp, &bp->fp[i], 0); +		if (rc) { +			BNX2X_ERR("Queue setup failed\n"); +			LOAD_ERROR_EXIT(bp, load_error_cnic2); +		} +	} + +	/* Initialize Rx filter. */ +	netif_addr_lock_bh(bp->dev); +	bnx2x_set_rx_mode(bp->dev); +	netif_addr_unlock_bh(bp->dev); + +	/* re-read iscsi info */ +	bnx2x_get_iscsi_info(bp); +	bnx2x_setup_cnic_irq_info(bp); +	bnx2x_setup_cnic_info(bp); +	bp->cnic_loaded = true; +	if (bp->state == BNX2X_STATE_OPEN) +		bnx2x_cnic_notify(bp, CNIC_CTL_START_CMD); + + +	DP(NETIF_MSG_IFUP, "Ending successfully CNIC-related load\n"); + +	return 0; + +#ifndef BNX2X_STOP_ON_ERROR +load_error_cnic2: +	/* Disable Timer scan */ +	REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 0); + +load_error_cnic1: +	bnx2x_napi_disable_cnic(bp); +	/* Update the number of queues without the cnic queues */ +	rc = bnx2x_set_real_num_queues(bp, 0); +	if (rc) +		BNX2X_ERR("Unable to set real_num_queues not including cnic\n"); +load_error_cnic0: +	BNX2X_ERR("CNIC-related load failed\n"); +	bnx2x_free_fp_mem_cnic(bp); +	bnx2x_free_mem_cnic(bp); +	return rc; +#endif /* ! BNX2X_STOP_ON_ERROR */  } @@ -1995,6 +2177,10 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)  	u32 load_code;  	int i, rc; +	DP(NETIF_MSG_IFUP, "Starting NIC load\n"); +	DP(NETIF_MSG_IFUP, +	   "CNIC is %s\n", CNIC_ENABLED(bp) ? "enabled" : "disabled"); +  #ifdef BNX2X_STOP_ON_ERROR  	if (unlikely(bp->panic)) {  		BNX2X_ERR("Can't load NIC when there is panic\n"); @@ -2022,9 +2208,11 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)  	DP(NETIF_MSG_IFUP, "num queues: %d", bp->num_queues);  	for_each_queue(bp, i)  		bnx2x_bz_fp(bp, i); -	memset(bp->bnx2x_txq, 0, bp->bnx2x_txq_size * -	       sizeof(struct bnx2x_fp_txdata)); +	memset(bp->bnx2x_txq, 0, (BNX2X_MAX_RSS_COUNT(bp) * BNX2X_MULTI_TX_COS + +				  bp->num_cnic_queues) * +				  sizeof(struct bnx2x_fp_txdata)); +	bp->fcoe_init = false;  	/* Set the receive queues buffer size */  	bnx2x_set_rx_buf_size(bp); @@ -2034,9 +2222,9 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)  	/* As long as bnx2x_alloc_mem() may possibly update  	 * bp->num_queues, bnx2x_set_real_num_queues() should always -	 * come after it. +	 * come after it. At this stage cnic queues are not counted.  	 */ -	rc = bnx2x_set_real_num_queues(bp); +	rc = bnx2x_set_real_num_queues(bp, 0);  	if (rc) {  		BNX2X_ERR("Unable to set real_num_queues\n");  		LOAD_ERROR_EXIT(bp, load_error0); @@ -2050,6 +2238,7 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)  	/* Add all NAPI objects */  	bnx2x_add_all_napi(bp); +	DP(NETIF_MSG_IFUP, "napi added\n");  	bnx2x_napi_enable(bp);  	/* set pf load just before approaching the MCP */ @@ -2073,7 +2262,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)  			 DRV_PULSE_SEQ_MASK);  		BNX2X_DEV_INFO("drv_pulse 0x%x\n", bp->fw_drv_pulse_wr_seq); -		load_code = bnx2x_fw_command(bp, DRV_MSG_CODE_LOAD_REQ, 0); +		load_code = bnx2x_fw_command(bp, DRV_MSG_CODE_LOAD_REQ, +					     DRV_MSG_CODE_LOAD_REQ_WITH_LFA);  		if (!load_code) {  			BNX2X_ERR("MCP response failure, aborting\n");  			rc = -EBUSY; @@ -2191,23 +2381,18 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)  		LOAD_ERROR_EXIT(bp, load_error3);  	} -#ifdef BCM_CNIC -	/* Enable Timer scan */ -	REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 1); -#endif - -	for_each_nondefault_queue(bp, i) { +	for_each_nondefault_eth_queue(bp, i) {  		rc = bnx2x_setup_queue(bp, &bp->fp[i], 0);  		if (rc) {  			BNX2X_ERR("Queue setup failed\n"); -			LOAD_ERROR_EXIT(bp, load_error4); +			LOAD_ERROR_EXIT(bp, load_error3);  		}  	}  	rc = bnx2x_init_rss_pf(bp);  	if (rc) {  		BNX2X_ERR("PF RSS init failed\n"); -		LOAD_ERROR_EXIT(bp, load_error4); +		LOAD_ERROR_EXIT(bp, load_error3);  	}  	/* Now when Clients are configured we are ready to work */ @@ -2217,7 +2402,7 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)  	rc = bnx2x_set_eth_mac(bp, true);  	if (rc) {  		BNX2X_ERR("Setting Ethernet MAC failed\n"); -		LOAD_ERROR_EXIT(bp, load_error4); +		LOAD_ERROR_EXIT(bp, load_error3);  	}  	if (bp->pending_max) { @@ -2227,6 +2412,7 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)  	if (bp->port.pmf)  		bnx2x_initial_phy_init(bp, load_mode); +	bp->link_params.feature_config_flags &= ~FEATURE_CONFIG_BOOT_FROM_SAN;  	/* Start fast path */ @@ -2257,21 +2443,15 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)  	}  	if (bp->port.pmf) -		bnx2x_update_drv_flags(bp, 1 << DRV_FLAGS_DCB_CONFIGURED, 0); +		bnx2x_update_drv_flags(bp, 1 << DRV_FLAGS_PORT_MASK, 0);  	else  		bnx2x__link_status_update(bp);  	/* start the timer */  	mod_timer(&bp->timer, jiffies + bp->current_interval); -#ifdef BCM_CNIC -	/* re-read iscsi info */ -	bnx2x_get_iscsi_info(bp); -	bnx2x_setup_cnic_irq_info(bp); -	bnx2x_setup_cnic_info(bp); -	if (bp->state == BNX2X_STATE_OPEN) -		bnx2x_cnic_notify(bp, CNIC_CTL_START_CMD); -#endif +	if (CNIC_ENABLED(bp)) +		bnx2x_load_cnic(bp);  	/* mark driver is loaded in shmem2 */  	if (SHMEM2_HAS(bp, drv_capabilities_flag)) { @@ -2293,14 +2473,11 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)  	if (bp->port.pmf && (bp->state != BNX2X_STATE_DIAG))  		bnx2x_dcbx_init(bp, false); +	DP(NETIF_MSG_IFUP, "Ending successfully NIC load\n"); +  	return 0;  #ifndef BNX2X_STOP_ON_ERROR -load_error4: -#ifdef BCM_CNIC -	/* Disable Timer scan */ -	REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 0); -#endif  load_error3:  	bnx2x_int_disable_sync(bp, 1); @@ -2338,6 +2515,8 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)  	int i;  	bool global = false; +	DP(NETIF_MSG_IFUP, "Starting NIC unload\n"); +  	/* mark driver is unloaded in shmem2 */  	if (SHMEM2_HAS(bp, drv_capabilities_flag)) {  		u32 val; @@ -2373,14 +2552,13 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)  	bp->state = BNX2X_STATE_CLOSING_WAIT4_HALT;  	smp_mb(); +	if (CNIC_LOADED(bp)) +		bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD); +  	/* Stop Tx */  	bnx2x_tx_disable(bp);  	netdev_reset_tc(bp->dev); -#ifdef BCM_CNIC -	bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD); -#endif -  	bp->rx_mode = BNX2X_RX_MODE_NONE;  	del_timer_sync(&bp->timer); @@ -2414,7 +2592,8 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)  		bnx2x_netif_stop(bp, 1);  		/* Delete all NAPI objects */  		bnx2x_del_all_napi(bp); - +		if (CNIC_LOADED(bp)) +			bnx2x_del_all_napi_cnic(bp);  		/* Release IRQs */  		bnx2x_free_irq(bp); @@ -2435,12 +2614,19 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)  	/* Free SKBs, SGEs, TPA pool and driver internals */  	bnx2x_free_skbs(bp); +	if (CNIC_LOADED(bp)) +		bnx2x_free_skbs_cnic(bp);  	for_each_rx_queue(bp, i)  		bnx2x_free_rx_sge_range(bp, bp->fp + i, NUM_RX_SGE); +	if (CNIC_LOADED(bp)) { +		bnx2x_free_fp_mem_cnic(bp); +		bnx2x_free_mem_cnic(bp); +	}  	bnx2x_free_mem(bp);  	bp->state = BNX2X_STATE_CLOSED; +	bp->cnic_loaded = false;  	/* Check if there are pending parity attentions. If there are - set  	 * RECOVERY_IN_PROGRESS. @@ -2460,6 +2646,8 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)  	if (!bnx2x_clear_pf_load(bp) && bnx2x_reset_is_done(bp, BP_PATH(bp)))  		bnx2x_disable_close_the_gate(bp); +	DP(NETIF_MSG_IFUP, "Ending NIC unload\n"); +  	return 0;  } @@ -2550,7 +2738,7 @@ int bnx2x_poll(struct napi_struct *napi, int budget)  		/* Fall out from the NAPI loop if needed */  		if (!(bnx2x_has_rx_work(fp) || bnx2x_has_tx_work(fp))) { -#ifdef BCM_CNIC +  			/* No need to update SB for FCoE L2 ring as long as  			 * it's connected to the default SB and the SB  			 * has been updated when NAPI was scheduled. @@ -2559,8 +2747,6 @@ int bnx2x_poll(struct napi_struct *napi, int budget)  				napi_complete(napi);  				break;  			} -#endif -  			bnx2x_update_fpsb_idx(fp);  			/* bnx2x_has_rx_work() reads the status block,  			 * thus we need to ensure that status block indices @@ -2940,7 +3126,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)  	txq_index = skb_get_queue_mapping(skb);  	txq = netdev_get_tx_queue(dev, txq_index); -	BUG_ON(txq_index >= MAX_ETH_TXQ_IDX(bp) + FCOE_PRESENT); +	BUG_ON(txq_index >= MAX_ETH_TXQ_IDX(bp) + (CNIC_LOADED(bp) ? 1 : 0));  	txdata = &bp->bnx2x_txq[txq_index]; @@ -2958,11 +3144,16 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)  			BDS_PER_TX_PKT +  			NEXT_CNT_PER_TX_PKT(MAX_BDS_PER_TX_PKT))) {  		/* Handle special storage cases separately */ -		if (txdata->tx_ring_size != 0) { -			BNX2X_ERR("BUG! Tx ring full when queue awake!\n"); +		if (txdata->tx_ring_size == 0) { +			struct bnx2x_eth_q_stats *q_stats = +				bnx2x_fp_qstats(bp, txdata->parent_fp); +			q_stats->driver_filtered_tx_pkt++; +			dev_kfree_skb(skb); +			return NETDEV_TX_OK; +		}  			bnx2x_fp_qstats(bp, txdata->parent_fp)->driver_xoff++;  			netif_tx_stop_queue(txq); -		} +		BNX2X_ERR("BUG! Tx ring full when queue awake!\n");  		return NETDEV_TX_BUSY;  	} @@ -3339,13 +3530,11 @@ int bnx2x_change_mac_addr(struct net_device *dev, void *p)  		return -EINVAL;  	} -#ifdef BCM_CNIC  	if ((IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp)) &&  	    !is_zero_ether_addr(addr->sa_data)) {  		BNX2X_ERR("Can't configure non-zero address on iSCSI or FCoE functions in MF-SD mode\n");  		return -EINVAL;  	} -#endif  	if (netif_running(dev))  {  		rc = bnx2x_set_eth_mac(bp, false); @@ -3369,13 +3558,11 @@ static void bnx2x_free_fp_mem_at(struct bnx2x *bp, int fp_index)  	u8 cos;  	/* Common */ -#ifdef BCM_CNIC +  	if (IS_FCOE_IDX(fp_index)) {  		memset(sb, 0, sizeof(union host_hc_status_block));  		fp->status_blk_mapping = 0; -  	} else { -#endif  		/* status blocks */  		if (!CHIP_IS_E1x(bp))  			BNX2X_PCI_FREE(sb->e2_sb, @@ -3387,9 +3574,8 @@ static void bnx2x_free_fp_mem_at(struct bnx2x *bp, int fp_index)  				       bnx2x_fp(bp, fp_index,  						status_blk_mapping),  				       sizeof(struct host_hc_status_block_e1x)); -#ifdef BCM_CNIC  	} -#endif +  	/* Rx */  	if (!skip_rx_queue(bp, fp_index)) {  		bnx2x_free_rx_bds(fp); @@ -3431,10 +3617,17 @@ static void bnx2x_free_fp_mem_at(struct bnx2x *bp, int fp_index)  	/* end of fastpath */  } +void bnx2x_free_fp_mem_cnic(struct bnx2x *bp) +{ +	int i; +	for_each_cnic_queue(bp, i) +		bnx2x_free_fp_mem_at(bp, i); +} +  void bnx2x_free_fp_mem(struct bnx2x *bp)  {  	int i; -	for_each_queue(bp, i) +	for_each_eth_queue(bp, i)  		bnx2x_free_fp_mem_at(bp, i);  } @@ -3519,14 +3712,11 @@ static int bnx2x_alloc_fp_mem_at(struct bnx2x *bp, int index)  	u8 cos;  	int rx_ring_size = 0; -#ifdef BCM_CNIC  	if (!bp->rx_ring_size &&  	    (IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp))) {  		rx_ring_size = MIN_RX_SIZE_NONTPA;  		bp->rx_ring_size = rx_ring_size; -	} else -#endif -	if (!bp->rx_ring_size) { +	} else if (!bp->rx_ring_size) {  		rx_ring_size = MAX_RX_AVAIL/BNX2X_NUM_RX_QUEUES(bp);  		if (CHIP_IS_E3(bp)) { @@ -3550,9 +3740,8 @@ static int bnx2x_alloc_fp_mem_at(struct bnx2x *bp, int index)  	/* Common */  	sb = &bnx2x_fp(bp, index, status_blk); -#ifdef BCM_CNIC +  	if (!IS_FCOE_IDX(index)) { -#endif  		/* status blocks */  		if (!CHIP_IS_E1x(bp))  			BNX2X_PCI_ALLOC(sb->e2_sb, @@ -3562,9 +3751,7 @@ static int bnx2x_alloc_fp_mem_at(struct bnx2x *bp, int index)  			BNX2X_PCI_ALLOC(sb->e1x_sb,  				&bnx2x_fp(bp, index, status_blk_mapping),  			    sizeof(struct host_hc_status_block_e1x)); -#ifdef BCM_CNIC  	} -#endif  	/* FCoE Queue uses Default SB and doesn't ACK the SB, thus no need to  	 * set shortcuts for it. @@ -3641,31 +3828,31 @@ alloc_mem_err:  	return 0;  } +int bnx2x_alloc_fp_mem_cnic(struct bnx2x *bp) +{ +	if (!NO_FCOE(bp)) +		/* FCoE */ +		if (bnx2x_alloc_fp_mem_at(bp, FCOE_IDX(bp))) +			/* we will fail load process instead of mark +			 * NO_FCOE_FLAG +			 */ +			return -ENOMEM; + +	return 0; +} +  int bnx2x_alloc_fp_mem(struct bnx2x *bp)  {  	int i; -	/** -	 * 1. Allocate FP for leading - fatal if error -	 * 2. {CNIC} Allocate FCoE FP - fatal if error -	 * 3. {CNIC} Allocate OOO + FWD - disable OOO if error -	 * 4. Allocate RSS - fix number of queues if error +	/* 1. Allocate FP for leading - fatal if error +	 * 2. Allocate RSS - fix number of queues if error  	 */  	/* leading */  	if (bnx2x_alloc_fp_mem_at(bp, 0))  		return -ENOMEM; -#ifdef BCM_CNIC -	if (!NO_FCOE(bp)) -		/* FCoE */ -		if (bnx2x_alloc_fp_mem_at(bp, FCOE_IDX(bp))) -			/* we will fail load process instead of mark -			 * NO_FCOE_FLAG -			 */ -			return -ENOMEM; -#endif -  	/* RSS */  	for_each_nondefault_eth_queue(bp, i)  		if (bnx2x_alloc_fp_mem_at(bp, i)) @@ -3676,17 +3863,17 @@ int bnx2x_alloc_fp_mem(struct bnx2x *bp)  		int delta = BNX2X_NUM_ETH_QUEUES(bp) - i;  		WARN_ON(delta < 0); -#ifdef BCM_CNIC -		/** -		 * move non eth FPs next to last eth FP -		 * must be done in that order -		 * FCOE_IDX < FWD_IDX < OOO_IDX -		 */ +		if (CNIC_SUPPORT(bp)) +			/* move non eth FPs next to last eth FP +			 * must be done in that order +			 * FCOE_IDX < FWD_IDX < OOO_IDX +			 */ -		/* move FCoE fp even NO_FCOE_FLAG is on */ -		bnx2x_move_fp(bp, FCOE_IDX(bp), FCOE_IDX(bp) - delta); -#endif -		bp->num_queues -= delta; +			/* move FCoE fp even NO_FCOE_FLAG is on */ +			bnx2x_move_fp(bp, FCOE_IDX(bp), FCOE_IDX(bp) - delta); +		bp->num_ethernet_queues -= delta; +		bp->num_queues = bp->num_ethernet_queues + +				 bp->num_cnic_queues;  		BNX2X_ERR("Adjusted num of queues from %d to %d\n",  			  bp->num_queues + delta, bp->num_queues);  	} @@ -3705,13 +3892,13 @@ void bnx2x_free_mem_bp(struct bnx2x *bp)  	kfree(bp->ilt);  } -int __devinit bnx2x_alloc_mem_bp(struct bnx2x *bp) +int bnx2x_alloc_mem_bp(struct bnx2x *bp)  {  	struct bnx2x_fastpath *fp;  	struct msix_entry *tbl;  	struct bnx2x_ilt *ilt;  	int msix_table_size = 0; -	int fp_array_size; +	int fp_array_size, txq_array_size;  	int i;  	/* @@ -3721,7 +3908,7 @@ int __devinit bnx2x_alloc_mem_bp(struct bnx2x *bp)  	msix_table_size = bp->igu_sb_cnt + 1;  	/* fp array: RSS plus CNIC related L2 queues */ -	fp_array_size = BNX2X_MAX_RSS_COUNT(bp) + NON_ETH_CONTEXT_USE; +	fp_array_size = BNX2X_MAX_RSS_COUNT(bp) + CNIC_SUPPORT(bp);  	BNX2X_DEV_INFO("fp_array_size %d", fp_array_size);  	fp = kcalloc(fp_array_size, sizeof(*fp), GFP_KERNEL); @@ -3750,12 +3937,12 @@ int __devinit bnx2x_alloc_mem_bp(struct bnx2x *bp)  		goto alloc_err;  	/* Allocate memory for the transmission queues array */ -	bp->bnx2x_txq_size = BNX2X_MAX_RSS_COUNT(bp) * BNX2X_MULTI_TX_COS; -#ifdef BCM_CNIC -	bp->bnx2x_txq_size++; -#endif -	bp->bnx2x_txq = kcalloc(bp->bnx2x_txq_size, -				sizeof(struct bnx2x_fp_txdata), GFP_KERNEL); +	txq_array_size = +		BNX2X_MAX_RSS_COUNT(bp) * BNX2X_MULTI_TX_COS + CNIC_SUPPORT(bp); +	BNX2X_DEV_INFO("txq_array_size %d", txq_array_size); + +	bp->bnx2x_txq = kcalloc(txq_array_size, sizeof(struct bnx2x_fp_txdata), +				GFP_KERNEL);  	if (!bp->bnx2x_txq)  		goto alloc_err; @@ -3838,7 +4025,7 @@ int bnx2x_get_link_cfg_idx(struct bnx2x *bp)  	return LINK_CONFIG_IDX(sel_phy_idx);  } -#if defined(NETDEV_FCOE_WWNN) && defined(BCM_CNIC) +#ifdef NETDEV_FCOE_WWNN  int bnx2x_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type)  {  	struct bnx2x *bp = netdev_priv(dev); diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h index 9c5ea6c5b4c7..0991534f61da 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h @@ -144,7 +144,7 @@ u32 bnx2x_fw_command(struct bnx2x *bp, u32 command, u32 param);   * @bp:		driver handle   * @load_mode:	current mode   */ -u8 bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode); +int bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode);  /**   * bnx2x_link_set - configure hw according to link parameters structure. @@ -238,7 +238,6 @@ irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance);   * @dev_instance:	private instance   */  irqreturn_t bnx2x_interrupt(int irq, void *dev_instance); -#ifdef BCM_CNIC  /**   * bnx2x_cnic_notify - send command to cnic driver @@ -262,8 +261,6 @@ void bnx2x_setup_cnic_irq_info(struct bnx2x *bp);   */  void bnx2x_setup_cnic_info(struct bnx2x *bp); -#endif -  /**   * bnx2x_int_enable - enable HW interrupts.   * @@ -283,7 +280,7 @@ void bnx2x_int_enable(struct bnx2x *bp);  void bnx2x_int_disable_sync(struct bnx2x *bp, int disable_hw);  /** - * bnx2x_nic_init - init driver internals. + * bnx2x_nic_init_cnic - init driver internals for cnic.   *   * @bp:		driver handle   * @load_code:	COMMON, PORT or FUNCTION @@ -293,9 +290,26 @@ void bnx2x_int_disable_sync(struct bnx2x *bp, int disable_hw);   *  - status blocks   *  - etc.   */ -void bnx2x_nic_init(struct bnx2x *bp, u32 load_code); +void bnx2x_nic_init_cnic(struct bnx2x *bp);  /** + * bnx2x_nic_init - init driver internals. + * + * @bp:		driver handle + * + * Initializes: + *  - rings + *  - status blocks + *  - etc. + */ +void bnx2x_nic_init(struct bnx2x *bp, u32 load_code); +/** + * bnx2x_alloc_mem_cnic - allocate driver's memory for cnic. + * + * @bp:		driver handle + */ +int bnx2x_alloc_mem_cnic(struct bnx2x *bp); +/**   * bnx2x_alloc_mem - allocate driver's memory.   *   * @bp:		driver handle @@ -303,6 +317,12 @@ void bnx2x_nic_init(struct bnx2x *bp, u32 load_code);  int bnx2x_alloc_mem(struct bnx2x *bp);  /** + * bnx2x_free_mem_cnic - release driver's memory for cnic. + * + * @bp:		driver handle + */ +void bnx2x_free_mem_cnic(struct bnx2x *bp); +/**   * bnx2x_free_mem - release driver's memory.   *   * @bp:		driver handle @@ -407,6 +427,7 @@ bool bnx2x_reset_is_done(struct bnx2x *bp, int engine);  void bnx2x_set_reset_in_progress(struct bnx2x *bp);  void bnx2x_set_reset_global(struct bnx2x *bp);  void bnx2x_disable_close_the_gate(struct bnx2x *bp); +int bnx2x_init_hw_func_cnic(struct bnx2x *bp);  /**   * bnx2x_sp_event - handle ramrods completion. @@ -424,6 +445,14 @@ void bnx2x_sp_event(struct bnx2x_fastpath *fp, union eth_rx_cqe *rr_cqe);  void bnx2x_ilt_set_info(struct bnx2x *bp);  /** + * bnx2x_ilt_set_cnic_info - prepare ILT configurations for SRC + * and TM. + * + * @bp:		driver handle + */ +void bnx2x_ilt_set_info_cnic(struct bnx2x *bp); + +/**   * bnx2x_dcbx_init - initialize dcbx protocol.   *   * @bp:		driver handle @@ -491,12 +520,17 @@ int bnx2x_resume(struct pci_dev *pdev);  /* Release IRQ vectors */  void bnx2x_free_irq(struct bnx2x *bp); +void bnx2x_free_fp_mem_cnic(struct bnx2x *bp);  void bnx2x_free_fp_mem(struct bnx2x *bp); +int bnx2x_alloc_fp_mem_cnic(struct bnx2x *bp);  int bnx2x_alloc_fp_mem(struct bnx2x *bp);  void bnx2x_init_rx_rings(struct bnx2x *bp); +void bnx2x_init_rx_rings_cnic(struct bnx2x *bp); +void bnx2x_free_skbs_cnic(struct bnx2x *bp);  void bnx2x_free_skbs(struct bnx2x *bp);  void bnx2x_netif_stop(struct bnx2x *bp, int disable_hw);  void bnx2x_netif_start(struct bnx2x *bp); +int bnx2x_load_cnic(struct bnx2x *bp);  /**   * bnx2x_enable_msix - set msix configuration. @@ -529,7 +563,7 @@ int bnx2x_poll(struct napi_struct *napi, int budget);   *   * @bp:		driver handle   */ -int __devinit bnx2x_alloc_mem_bp(struct bnx2x *bp); +int bnx2x_alloc_mem_bp(struct bnx2x *bp);  /**   * bnx2x_free_mem_bp - release memories outsize main driver structure @@ -547,7 +581,7 @@ void bnx2x_free_mem_bp(struct bnx2x *bp);   */  int bnx2x_change_mtu(struct net_device *dev, int new_mtu); -#if defined(NETDEV_FCOE_WWNN) && defined(BCM_CNIC) +#ifdef NETDEV_FCOE_WWNN  /**   * bnx2x_fcoe_get_wwn - return the requested WWN value for this port   * @@ -793,23 +827,39 @@ static inline void bnx2x_free_rx_sge(struct bnx2x *bp,  	sge->addr_lo = 0;  } -static inline void bnx2x_add_all_napi(struct bnx2x *bp) +static inline void bnx2x_add_all_napi_cnic(struct bnx2x *bp)  {  	int i; -	bp->num_napi_queues = bp->num_queues; +	/* Add NAPI objects */ +	for_each_rx_queue_cnic(bp, i) +		netif_napi_add(bp->dev, &bnx2x_fp(bp, i, napi), +			       bnx2x_poll, BNX2X_NAPI_WEIGHT); +} + +static inline void bnx2x_add_all_napi(struct bnx2x *bp) +{ +	int i;  	/* Add NAPI objects */ -	for_each_rx_queue(bp, i) +	for_each_eth_queue(bp, i)  		netif_napi_add(bp->dev, &bnx2x_fp(bp, i, napi),  			       bnx2x_poll, BNX2X_NAPI_WEIGHT);  } +static inline void bnx2x_del_all_napi_cnic(struct bnx2x *bp) +{ +	int i; + +	for_each_rx_queue_cnic(bp, i) +		netif_napi_del(&bnx2x_fp(bp, i, napi)); +} +  static inline void bnx2x_del_all_napi(struct bnx2x *bp)  {  	int i; -	for_each_rx_queue(bp, i) +	for_each_eth_queue(bp, i)  		netif_napi_del(&bnx2x_fp(bp, i, napi));  } @@ -979,11 +1029,9 @@ static inline u8 bnx2x_stats_id(struct bnx2x_fastpath *fp)  {  	struct bnx2x *bp = fp->bp;  	if (!CHIP_IS_E1x(bp)) { -#ifdef BCM_CNIC  		/* there are special statistics counters for FCoE 136..140 */  		if (IS_FCOE_FP(fp))  			return bp->cnic_base_cl_id + (bp->pf_num >> 1); -#endif  		return fp->cl_id;  	}  	return fp->cl_id + BP_PORT(bp) * FP_SB_MAX_E1x; @@ -1102,7 +1150,6 @@ static inline void bnx2x_init_txdata(struct bnx2x *bp,  	   txdata->cid, txdata->txq_index);  } -#ifdef BCM_CNIC  static inline u8 bnx2x_cnic_eth_cl_id(struct bnx2x *bp, u8 cl_idx)  {  	return bp->cnic_base_cl_id + cl_idx + @@ -1162,7 +1209,6 @@ static inline void bnx2x_init_fcoe_fp(struct bnx2x *bp)  	   fp->index, bp, fp->status_blk.e2_sb, fp->cl_id, fp->fw_sb_id,  	   fp->igu_sb_id);  } -#endif  static inline int bnx2x_clean_tx_queue(struct bnx2x *bp,  				       struct bnx2x_fp_txdata *txdata) @@ -1280,7 +1326,7 @@ static inline bool bnx2x_mtu_allows_gro(int mtu)  	 */  	return mtu <= SGE_PAGE_SIZE && (U_ETH_SGL_SIZE * fpp) <= MAX_SKB_FRAGS;  } -#ifdef BCM_CNIC +  /**   * bnx2x_get_iscsi_info - update iSCSI params according to licensing info.   * @@ -1288,7 +1334,6 @@ static inline bool bnx2x_mtu_allows_gro(int mtu)   *   */  void bnx2x_get_iscsi_info(struct bnx2x *bp); -#endif  /**   * bnx2x_link_sync_notify - send notification to other functions. @@ -1340,13 +1385,11 @@ static inline void bnx2x_update_drv_flags(struct bnx2x *bp, u32 flags, u32 set)  static inline bool bnx2x_is_valid_ether_addr(struct bnx2x *bp, u8 *addr)  { -	if (is_valid_ether_addr(addr)) +	if (is_valid_ether_addr(addr) || +	    (is_zero_ether_addr(addr) && +	     (IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp))))  		return true; -#ifdef BCM_CNIC -	if (is_zero_ether_addr(addr) && -	    (IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp))) -		return true; -#endif +  	return false;  } diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c index 2245c3895409..10bc093d2ca4 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c @@ -413,8 +413,11 @@ static int bnx2x_dcbx_read_mib(struct bnx2x *bp,  static void bnx2x_pfc_set_pfc(struct bnx2x *bp)  { +	int mfw_configured = SHMEM2_HAS(bp, drv_flags) && +			     GET_FLAGS(SHMEM2_RD(bp, drv_flags), +				       1 << DRV_FLAGS_DCB_MFW_CONFIGURED);  	if (bp->dcbx_port_params.pfc.enabled && -	    !(bp->dcbx_error & DCBX_REMOTE_MIB_ERROR)) +	    (!(bp->dcbx_error & DCBX_REMOTE_MIB_ERROR) || mfw_configured))  		/*  		 * 1. Fills up common PFC structures if required  		 * 2. Configure NIG, MAC and BRB via the elink @@ -552,10 +555,13 @@ static void bnx2x_dcbx_update_ets_config(struct bnx2x *bp)  static void bnx2x_dcbx_update_ets_params(struct bnx2x *bp)  { +	int mfw_configured = SHMEM2_HAS(bp, drv_flags) && +			     GET_FLAGS(SHMEM2_RD(bp, drv_flags), +				       1 << DRV_FLAGS_DCB_MFW_CONFIGURED);  	bnx2x_ets_disabled(&bp->link_params, &bp->link_vars);  	if (!bp->dcbx_port_params.ets.enabled || -	    (bp->dcbx_error & DCBX_REMOTE_MIB_ERROR)) +	    ((bp->dcbx_error & DCBX_REMOTE_MIB_ERROR) && !mfw_configured))  		return;  	if (CHIP_IS_E3B0(bp)) @@ -1802,11 +1808,14 @@ static void bnx2x_dcbx_fw_struct(struct bnx2x *bp,  	u8 cos = 0, pri = 0;  	struct priority_cos *tt2cos;  	u32 *ttp = bp->dcbx_port_params.app.traffic_type_priority; +	int mfw_configured = SHMEM2_HAS(bp, drv_flags) && +			     GET_FLAGS(SHMEM2_RD(bp, drv_flags), +				       1 << DRV_FLAGS_DCB_MFW_CONFIGURED);  	memset(pfc_fw_cfg, 0, sizeof(*pfc_fw_cfg));  	/* to disable DCB - the structure must be zeroed */ -	if (bp->dcbx_error & DCBX_REMOTE_MIB_ERROR) +	if ((bp->dcbx_error & DCBX_REMOTE_MIB_ERROR) && !mfw_configured)  		return;  	/*shortcut*/ @@ -1895,6 +1904,11 @@ static u8 bnx2x_dcbnl_set_state(struct net_device *netdev, u8 state)  	struct bnx2x *bp = netdev_priv(netdev);  	DP(BNX2X_MSG_DCB, "state = %s\n", state ? "on" : "off"); +	if (state && ((bp->dcbx_enabled == BNX2X_DCBX_ENABLED_OFF) || +		      (bp->dcbx_enabled == BNX2X_DCBX_ENABLED_INVALID))) { +		DP(BNX2X_MSG_DCB, "Can not set dcbx to enabled while it is disabled in nvm\n"); +		return 1; +	}  	bnx2x_dcbx_set_state(bp, (state ? true : false), bp->dcbx_enabled);  	return 0;  } @@ -1908,10 +1922,10 @@ static void bnx2x_dcbnl_get_perm_hw_addr(struct net_device *netdev,  	/* first the HW mac address */  	memcpy(perm_addr, netdev->dev_addr, netdev->addr_len); -#ifdef BCM_CNIC -	/* second SAN address */ -	memcpy(perm_addr+netdev->addr_len, bp->fip_mac, netdev->addr_len); -#endif +	if (CNIC_LOADED(bp)) +		/* second SAN address */ +		memcpy(perm_addr+netdev->addr_len, bp->fip_mac, +		       netdev->addr_len);  }  static void bnx2x_dcbnl_set_pg_tccfg_tx(struct net_device *netdev, int prio, @@ -2038,10 +2052,13 @@ static void bnx2x_dcbnl_set_pfc_cfg(struct net_device *netdev, int prio,  	if (!bnx2x_dcbnl_set_valid(bp) || prio >= MAX_PFC_PRIORITIES)  		return; -	bp->dcbx_config_params.admin_pfc_bitmap |= ((setting ? 1 : 0) << prio); -	if (setting) +	if (setting) { +		bp->dcbx_config_params.admin_pfc_bitmap |= (1 << prio);  		bp->dcbx_config_params.admin_pfc_tx_enable = 1; +	} else { +		bp->dcbx_config_params.admin_pfc_bitmap &= ~(1 << prio); +	}  }  static void bnx2x_dcbnl_get_pfc_cfg(struct net_device *netdev, int prio, @@ -2073,8 +2090,12 @@ static u8 bnx2x_dcbnl_set_all(struct net_device *netdev)  			   "Handling parity error recovery. Try again later\n");  		return 1;  	} -	if (netif_running(bp->dev)) +	if (netif_running(bp->dev)) { +		bnx2x_update_drv_flags(bp, +				       1 << DRV_FLAGS_DCB_MFW_CONFIGURED, +				       1);  		bnx2x_dcbx_init(bp, true); +	}  	DP(BNX2X_MSG_DCB, "set_dcbx_params done (%d)\n", rc);  	if (rc)  		return 1; diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c index 6e5bdd1a31d9..277f17e3c8f8 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c @@ -62,7 +62,9 @@ static const struct {  						8, "[%s]: tpa_aggregations" },  	{ Q_STATS_OFFSET32(total_tpa_aggregated_frames_hi),  					8, "[%s]: tpa_aggregated_frames"}, -	{ Q_STATS_OFFSET32(total_tpa_bytes_hi),	8, "[%s]: tpa_bytes"} +	{ Q_STATS_OFFSET32(total_tpa_bytes_hi),	8, "[%s]: tpa_bytes"}, +	{ Q_STATS_OFFSET32(driver_filtered_tx_pkt), +					4, "[%s]: driver_filtered_tx_pkt" }  };  #define BNX2X_NUM_Q_STATS ARRAY_SIZE(bnx2x_q_stats_arr) @@ -177,6 +179,8 @@ static const struct {  			4, STATS_FLAGS_FUNC, "recoverable_errors" },  	{ STATS_OFFSET32(unrecoverable_error),  			4, STATS_FLAGS_FUNC, "unrecoverable_errors" }, +	{ STATS_OFFSET32(driver_filtered_tx_pkt), +			4, STATS_FLAGS_FUNC, "driver_filtered_tx_pkt" },  	{ STATS_OFFSET32(eee_tx_lpi),  			4, STATS_FLAGS_PORT, "Tx LPI entry count"}  }; @@ -227,18 +231,14 @@ static int bnx2x_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)  		cmd->advertising &= ~(ADVERTISED_10000baseT_Full);  	} -	if ((bp->state == BNX2X_STATE_OPEN) && (bp->link_vars.link_up)) { -		if (!(bp->flags & MF_FUNC_DIS)) { -			ethtool_cmd_speed_set(cmd, bp->link_vars.line_speed); +	if ((bp->state == BNX2X_STATE_OPEN) && bp->link_vars.link_up && +	    !(bp->flags & MF_FUNC_DIS)) {  			cmd->duplex = bp->link_vars.duplex; -		} else { -			ethtool_cmd_speed_set( -				cmd, bp->link_params.req_line_speed[cfg_idx]); -			cmd->duplex = bp->link_params.req_duplex[cfg_idx]; -		}  		if (IS_MF(bp) && !BP_NOMCP(bp))  			ethtool_cmd_speed_set(cmd, bnx2x_get_mf_speed(bp)); +		else +			ethtool_cmd_speed_set(cmd, bp->link_vars.line_speed);  	} else {  		cmd->duplex = DUPLEX_UNKNOWN;  		ethtool_cmd_speed_set(cmd, SPEED_UNKNOWN); @@ -2660,20 +2660,25 @@ static int bnx2x_set_phys_id(struct net_device *dev,  		return 1;	/* cycle on/off once per second */  	case ETHTOOL_ID_ON: +		bnx2x_acquire_phy_lock(bp);  		bnx2x_set_led(&bp->link_params, &bp->link_vars,  			      LED_MODE_ON, SPEED_1000); +		bnx2x_release_phy_lock(bp);  		break;  	case ETHTOOL_ID_OFF: +		bnx2x_acquire_phy_lock(bp);  		bnx2x_set_led(&bp->link_params, &bp->link_vars,  			      LED_MODE_FRONT_PANEL_OFF, 0); - +		bnx2x_release_phy_lock(bp);  		break;  	case ETHTOOL_ID_INACTIVE: +		bnx2x_acquire_phy_lock(bp);  		bnx2x_set_led(&bp->link_params, &bp->link_vars,  			      LED_MODE_OPER,  			      bp->link_vars.line_speed); +		bnx2x_release_phy_lock(bp);  	}  	return 0; @@ -2901,7 +2906,9 @@ static void bnx2x_get_channels(struct net_device *dev,  static void bnx2x_change_num_queues(struct bnx2x *bp, int num_rss)  {  	bnx2x_disable_msi(bp); -	BNX2X_NUM_QUEUES(bp) = num_rss + NON_ETH_CONTEXT_USE; +	bp->num_ethernet_queues = num_rss; +	bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues; +	BNX2X_DEV_INFO("set number of queues to %d\n", bp->num_queues);  	bnx2x_set_int_mode(bp);  } diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h index 620fe939ecfd..60a83ad10370 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h @@ -23,6 +23,11 @@  	(IRO[159].base + ((funcId) * IRO[159].m1))  #define CSTORM_FUNC_EN_OFFSET(funcId) \  	(IRO[149].base + ((funcId) * IRO[149].m1)) +#define CSTORM_HC_SYNC_LINE_INDEX_E1X_OFFSET(hcIndex, sbId) \ +	(IRO[139].base + ((hcIndex) * IRO[139].m1) + ((sbId) * IRO[139].m2)) +#define CSTORM_HC_SYNC_LINE_INDEX_E2_OFFSET(hcIndex, sbId) \ +	(IRO[138].base + (((hcIndex)>>2) * IRO[138].m1) + (((hcIndex)&3) \ +	* IRO[138].m2) + ((sbId) * IRO[138].m3))  #define CSTORM_IGU_MODE_OFFSET (IRO[157].base)  #define CSTORM_ISCSI_CQ_SIZE_OFFSET(pfId) \  	(IRO[316].base + ((pfId) * IRO[316].m1)) diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h index 18704929e642..3369a50ac6b4 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h @@ -500,7 +500,15 @@ struct port_hw_cfg {		    /* port 0: 0x12c  port 1: 0x2bc */  	u32 e3_cmn_pin_cfg1;				    /* 0x170 */  	#define PORT_HW_CFG_E3_OVER_CURRENT_MASK            0x000000FF  	#define PORT_HW_CFG_E3_OVER_CURRENT_SHIFT                    0 -	u32 reserved0[7];				    /* 0x174 */ + +	/*  pause on host ring */ +	u32 generic_features;                               /* 0x174 */ +	#define PORT_HW_CFG_PAUSE_ON_HOST_RING_MASK                   0x00000001 +	#define PORT_HW_CFG_PAUSE_ON_HOST_RING_SHIFT                  0 +	#define PORT_HW_CFG_PAUSE_ON_HOST_RING_DISABLED               0x00000000 +	#define PORT_HW_CFG_PAUSE_ON_HOST_RING_ENABLED                0x00000001 + +	u32 reserved0[6];				    /* 0x178 */  	u32 aeu_int_mask;				    /* 0x190 */ @@ -695,6 +703,7 @@ struct port_hw_cfg {		    /* port 0: 0x12c  port 1: 0x2bc */  		#define PORT_HW_CFG_XGXS_EXT_PHY2_TYPE_BCM54618SE    0x00000e00  		#define PORT_HW_CFG_XGXS_EXT_PHY2_TYPE_BCM8722       0x00000f00  		#define PORT_HW_CFG_XGXS_EXT_PHY2_TYPE_BCM54616      0x00001000 +		#define PORT_HW_CFG_XGXS_EXT_PHY2_TYPE_BCM84834      0x00001100  		#define PORT_HW_CFG_XGXS_EXT_PHY2_TYPE_FAILURE       0x0000fd00  		#define PORT_HW_CFG_XGXS_EXT_PHY2_TYPE_NOT_CONN      0x0000ff00 @@ -751,6 +760,7 @@ struct port_hw_cfg {		    /* port 0: 0x12c  port 1: 0x2bc */  		#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE     0x00000e00  		#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8722        0x00000f00  		#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54616       0x00001000 +		#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834       0x00001100  		#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT_WC      0x0000fc00  		#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE        0x0000fd00  		#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_NOT_CONN       0x0000ff00 @@ -1246,6 +1256,7 @@ struct drv_func_mb {  	#define DRV_MSG_CODE_VRFY_AFEX_SUPPORTED        0xa2000000  	#define REQ_BC_VER_4_VRFY_AFEX_SUPPORTED        0x00070002  	#define REQ_BC_VER_4_SFP_TX_DISABLE_SUPPORTED   0x00070014 +	#define REQ_BC_VER_4_MT_SUPPORTED               0x00070201  	#define REQ_BC_VER_4_PFC_STATS_SUPPORTED        0x00070201  	#define REQ_BC_VER_4_FCOE_FEATURES              0x00070209 @@ -1515,12 +1526,13 @@ enum mf_cfg_afex_vlan_mode {  /* This structure is not applicable and should not be accessed on 57711 */  struct func_ext_cfg {  	u32 func_cfg; -	#define MACP_FUNC_CFG_FLAGS_MASK                0x000000FF +	#define MACP_FUNC_CFG_FLAGS_MASK                0x0000007F  	#define MACP_FUNC_CFG_FLAGS_SHIFT               0  	#define MACP_FUNC_CFG_FLAGS_ENABLED             0x00000001  	#define MACP_FUNC_CFG_FLAGS_ETHERNET            0x00000002  	#define MACP_FUNC_CFG_FLAGS_ISCSI_OFFLOAD       0x00000004  	#define MACP_FUNC_CFG_FLAGS_FCOE_OFFLOAD        0x00000008 +	#define MACP_FUNC_CFG_PAUSE_ON_HOST_RING        0x00000080  	u32 iscsi_mac_addr_upper;  	u32 iscsi_mac_addr_lower; @@ -2085,8 +2097,13 @@ struct shmem2_region {  	/* generic flags controlled by the driver */  	u32 drv_flags; -	#define DRV_FLAGS_DCB_CONFIGURED                0x1 +	#define DRV_FLAGS_DCB_CONFIGURED		0x0 +	#define DRV_FLAGS_DCB_CONFIGURATION_ABORTED	0x1 +	#define DRV_FLAGS_DCB_MFW_CONFIGURED	0x2 +	#define DRV_FLAGS_PORT_MASK	((1 << DRV_FLAGS_DCB_CONFIGURED) | \ +			(1 << DRV_FLAGS_DCB_CONFIGURATION_ABORTED) | \ +			(1 << DRV_FLAGS_DCB_MFW_CONFIGURED))  	/* pointer to extended dev_info shared data copied from nvm image */  	u32 extended_dev_info_shared_addr;  	u32 ncsi_oem_data_addr; @@ -2159,6 +2176,16 @@ struct shmem2_region {  	#define SHMEM_EEE_TIME_OUTPUT_BIT	   0x80000000  	u32 sizeof_port_stats; + +	/* Link Flap Avoidance */ +	u32 lfa_host_addr[PORT_MAX]; +	u32 reserved1; + +	u32 reserved2;				/* Offset 0x148 */ +	u32 reserved3;				/* Offset 0x14C */ +	u32 reserved4;				/* Offset 0x150 */ +	u32 link_attr_sync[PORT_MAX];		/* Offset 0x154 */ +	#define LINK_ATTR_SYNC_KR2_ENABLE	(1<<0)  }; @@ -4845,9 +4872,17 @@ struct vif_list_event_data {  	__le32 reserved2;  }; -/* - * union for all event ring message types - */ +/* function update event data */ +struct function_update_event_data { +	u8 echo; +	u8 reserved; +	__le16 reserved0; +	__le32 reserved1; +	__le32 reserved2; +}; + + +/* union for all event ring message types */  union event_data {  	struct vf_pf_event_data vf_pf_event;  	struct eth_event_data eth_event; @@ -4855,6 +4890,7 @@ union event_data {  	struct vf_flr_event_data vf_flr_event;  	struct malicious_vf_event_data malicious_vf_event;  	struct vif_list_event_data vif_list_event; +	struct function_update_event_data function_update_event;  }; @@ -4984,8 +5020,10 @@ struct function_update_data {  	u8 allowed_priorities;  	u8 network_cos_mode;  	u8 lb_mode_en; -	u8 reserved0; -	__le32 reserved1; +	u8 tx_switch_suspend_change_flg; +	u8 tx_switch_suspend; +	u8 echo; +	__le16 reserved1;  }; diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h index fe66d902dc62..d755acfe7a40 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h @@ -648,15 +648,25 @@ static int bnx2x_ilt_client_mem_op(struct bnx2x *bp, int cli_num,  	return rc;  } +static int bnx2x_ilt_mem_op_cnic(struct bnx2x *bp, u8 memop) +{ +	int rc = 0; + +	if (CONFIGURE_NIC_MODE(bp)) +		rc = bnx2x_ilt_client_mem_op(bp, ILT_CLIENT_SRC, memop); +	if (!rc) +		rc = bnx2x_ilt_client_mem_op(bp, ILT_CLIENT_TM, memop); + +	return rc; +} +  static int bnx2x_ilt_mem_op(struct bnx2x *bp, u8 memop)  {  	int rc = bnx2x_ilt_client_mem_op(bp, ILT_CLIENT_CDU, memop);  	if (!rc)  		rc = bnx2x_ilt_client_mem_op(bp, ILT_CLIENT_QM, memop); -	if (!rc) +	if (!rc && CNIC_SUPPORT(bp) && !CONFIGURE_NIC_MODE(bp))  		rc = bnx2x_ilt_client_mem_op(bp, ILT_CLIENT_SRC, memop); -	if (!rc) -		rc = bnx2x_ilt_client_mem_op(bp, ILT_CLIENT_TM, memop);  	return rc;  } @@ -781,12 +791,19 @@ static void bnx2x_ilt_client_id_init_op(struct bnx2x *bp,  	bnx2x_ilt_client_init_op(bp, ilt_cli, initop);  } +static void bnx2x_ilt_init_op_cnic(struct bnx2x *bp, u8 initop) +{ +	if (CONFIGURE_NIC_MODE(bp)) +		bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_SRC, initop); +	bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_TM, initop); +} +  static void bnx2x_ilt_init_op(struct bnx2x *bp, u8 initop)  {  	bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_CDU, initop);  	bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_QM, initop); -	bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_SRC, initop); -	bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_TM, initop); +	if (CNIC_SUPPORT(bp) && !CONFIGURE_NIC_MODE(bp)) +		bnx2x_ilt_client_id_init_op(bp, ILT_CLIENT_SRC, initop);  }  static void bnx2x_ilt_init_client_psz(struct bnx2x *bp, int cli_num, @@ -890,7 +907,6 @@ static void bnx2x_qm_init_ptr_table(struct bnx2x *bp, int qm_cid_count,  /****************************************************************************  * SRC initializations  ****************************************************************************/ -#ifdef BCM_CNIC  /* called during init func stage */  static void bnx2x_src_init_t2(struct bnx2x *bp, struct src_ent *t2,  			      dma_addr_t t2_mapping, int src_cid_count) @@ -915,5 +931,4 @@ static void bnx2x_src_init_t2(struct bnx2x *bp, struct src_ent *t2,  		    U64_HI((u64)t2_mapping +  			   (src_cid_count-1) * sizeof(struct src_ent)));  } -#endif  #endif /* BNX2X_INIT_OPS_H */ diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c index f6cfdc6cf20f..09096b43a6e9 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c @@ -121,6 +121,7 @@  #define	GP_STATUS_10G_XFI   MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_XFI  #define	GP_STATUS_20G_DXGXS MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_20G_DXGXS  #define	GP_STATUS_10G_SFI   MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_SFI +#define	GP_STATUS_20G_KR2 MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_20G_KR2  #define LINK_10THD		LINK_STATUS_SPEED_AND_DUPLEX_10THD  #define LINK_10TFD		LINK_STATUS_SPEED_AND_DUPLEX_10TFD  #define LINK_100TXHD		LINK_STATUS_SPEED_AND_DUPLEX_100TXHD @@ -253,6 +254,12 @@ static int bnx2x_check_lfa(struct link_params *params)  	if (!(link_status & LINK_STATUS_LINK_UP))  		return LFA_LINK_DOWN; +	/* if loaded after BOOT from SAN, don't flap the link in any case and +	 * rely on link set by preboot driver +	 */ +	if (params->feature_config_flags & FEATURE_CONFIG_BOOT_FROM_SAN) +		return 0; +  	/* Verify that loopback mode is not set */  	if (params->loopback_mode)  		return LFA_LOOPBACK_ENABLED; @@ -1440,30 +1447,47 @@ void bnx2x_pfc_statistic(struct link_params *params, struct link_vars *vars,  /******************************************************************/  /*			MAC/PBF section				  */  /******************************************************************/ -static void bnx2x_set_mdio_clk(struct bnx2x *bp, u32 chip_id, u8 port) +static void bnx2x_set_mdio_clk(struct bnx2x *bp, u32 chip_id, +			       u32 emac_base)  { -	u32 mode, emac_base; +	u32 new_mode, cur_mode; +	u32 clc_cnt;  	/* Set clause 45 mode, slow down the MDIO clock to 2.5MHz  	 * (a value of 49==0x31) and make sure that the AUTO poll is off  	 */ +	cur_mode = REG_RD(bp, emac_base + EMAC_REG_EMAC_MDIO_MODE); -	if (CHIP_IS_E2(bp)) -		emac_base = GRCBASE_EMAC0; -	else -		emac_base = (port) ? GRCBASE_EMAC1 : GRCBASE_EMAC0; -	mode = REG_RD(bp, emac_base + EMAC_REG_EMAC_MDIO_MODE); -	mode &= ~(EMAC_MDIO_MODE_AUTO_POLL | -		  EMAC_MDIO_MODE_CLOCK_CNT);  	if (USES_WARPCORE(bp)) -		mode |= (74L << EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT); +		clc_cnt = 74L << EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT;  	else -		mode |= (49L << EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT); +		clc_cnt = 49L << EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT; -	mode |= (EMAC_MDIO_MODE_CLAUSE_45); -	REG_WR(bp, emac_base + EMAC_REG_EMAC_MDIO_MODE, mode); +	if (((cur_mode & EMAC_MDIO_MODE_CLOCK_CNT) == clc_cnt) && +	    (cur_mode & (EMAC_MDIO_MODE_CLAUSE_45))) +		return; +	new_mode = cur_mode & +		~(EMAC_MDIO_MODE_AUTO_POLL | EMAC_MDIO_MODE_CLOCK_CNT); +	new_mode |= clc_cnt; +	new_mode |= (EMAC_MDIO_MODE_CLAUSE_45); + +	DP(NETIF_MSG_LINK, "Changing emac_mode from 0x%x to 0x%x\n", +	   cur_mode, new_mode); +	REG_WR(bp, emac_base + EMAC_REG_EMAC_MDIO_MODE, new_mode);  	udelay(40);  } + +static void bnx2x_set_mdio_emac_per_phy(struct bnx2x *bp, +					struct link_params *params) +{ +	u8 phy_index; +	/* Set mdio clock per phy */ +	for (phy_index = INT_PHY; phy_index < params->num_phys; +	      phy_index++) +		bnx2x_set_mdio_clk(bp, params->chip_id, +				   params->phy[phy_index].mdio_ctrl); +} +  static u8 bnx2x_is_4_port_mode(struct bnx2x *bp)  {  	u32 port4mode_ovwr_val; @@ -1508,7 +1532,8 @@ static void bnx2x_emac_init(struct link_params *params,  		}  		timeout--;  	} while (val & EMAC_MODE_RESET); -	bnx2x_set_mdio_clk(bp, params->chip_id, port); + +	bnx2x_set_mdio_emac_per_phy(bp, params);  	/* Set mac address */  	val = ((params->mac_addr[0] << 8) |  		params->mac_addr[1]); @@ -1664,7 +1689,10 @@ static void bnx2x_xmac_init(struct link_params *params, u32 max_speed)  	 * ports of the path  	 */ -	if ((CHIP_NUM(bp) == CHIP_NUM_57840_4_10) && +	if (((CHIP_NUM(bp) == CHIP_NUM_57840_4_10) || +	     (CHIP_NUM(bp) == CHIP_NUM_57840_2_20) || +	     (CHIP_NUM(bp) == CHIP_NUM_57840_OBSOLETE)) && +	    is_port4mode &&  	    (REG_RD(bp, MISC_REG_RESET_REG_2) &  	     MISC_REGISTERS_RESET_REG_2_XMAC)) {  		DP(NETIF_MSG_LINK, @@ -1760,6 +1788,18 @@ static int bnx2x_xmac_enable(struct link_params *params,  	 */  	REG_WR(bp, NIG_REG_EGRESS_EMAC0_PORT + params->port*4, 0); +	/* When XMAC is in XLGMII mode, disable sending idles for fault +	 * detection. +	 */ +	if (!(params->phy[INT_PHY].flags & FLAGS_TX_ERROR_CHECK)) { +		REG_WR(bp, xmac_base + XMAC_REG_RX_LSS_CTRL, +		       (XMAC_RX_LSS_CTRL_REG_LOCAL_FAULT_DISABLE | +			XMAC_RX_LSS_CTRL_REG_REMOTE_FAULT_DISABLE)); +		REG_WR(bp, xmac_base + XMAC_REG_CLEAR_RX_LSS_STATUS, 0); +		REG_WR(bp, xmac_base + XMAC_REG_CLEAR_RX_LSS_STATUS, +		       XMAC_CLEAR_RX_LSS_STATUS_REG_CLEAR_LOCAL_FAULT_STATUS | +		       XMAC_CLEAR_RX_LSS_STATUS_REG_CLEAR_REMOTE_FAULT_STATUS); +	}  	/* Set Max packet size */  	REG_WR(bp, xmac_base + XMAC_REG_RX_MAX_SIZE, 0x2710); @@ -1780,6 +1820,12 @@ static int bnx2x_xmac_enable(struct link_params *params,  	/* Enable TX and RX */  	val = XMAC_CTRL_REG_TX_EN | XMAC_CTRL_REG_RX_EN; +	/* Set MAC in XLGMII mode for dual-mode */ +	if ((vars->line_speed == SPEED_20000) && +	    (params->phy[INT_PHY].supported & +	     SUPPORTED_20000baseKR2_Full)) +		val |= XMAC_CTRL_REG_XLGMII_ALIGN_ENB; +  	/* Check loopback mode */  	if (lb)  		val |= XMAC_CTRL_REG_LINE_LOCAL_LPBK; @@ -2096,6 +2142,16 @@ static void bnx2x_update_mng(struct link_params *params, u32 link_status)  			port_mb[params->port].link_status), link_status);  } +static void bnx2x_update_link_attr(struct link_params *params, u32 link_attr) +{ +	struct bnx2x *bp = params->bp; + +	if (SHMEM2_HAS(bp, link_attr_sync)) +		REG_WR(bp, params->shmem2_base + +		       offsetof(struct shmem2_region, +				link_attr_sync[params->port]), link_attr); +} +  static void bnx2x_update_pfc_nig(struct link_params *params,  		struct link_vars *vars,  		struct bnx2x_nig_brb_pfc_port_params *nig_params) @@ -2126,7 +2182,7 @@ static void bnx2x_update_pfc_nig(struct link_params *params,  		if (CHIP_IS_E3(bp))  			ppp_enable = 0;  		else -		ppp_enable = 1; +			ppp_enable = 1;  		xcm_mask &= ~(port ? NIG_LLH1_XCM_MASK_REG_LLH1_XCM_MASK_BCN :  				     NIG_LLH0_XCM_MASK_REG_LLH0_XCM_MASK_BCN);  		xcm_out_en = 0; @@ -2247,7 +2303,6 @@ int bnx2x_update_pfc(struct link_params *params,  	return bnx2x_status;  } -  static int bnx2x_bmac1_enable(struct link_params *params,  			      struct link_vars *vars,  			      u8 is_lb) @@ -2651,6 +2706,13 @@ static int bnx2x_cl45_read(struct bnx2x *bp, struct bnx2x_phy *phy,  	u32 val;  	u16 i;  	int rc = 0; +	u32 chip_id; +	if (phy->flags & FLAGS_MDC_MDIO_WA_G) { +		chip_id = (REG_RD(bp, MISC_REG_CHIP_NUM) << 16) | +			  ((REG_RD(bp, MISC_REG_CHIP_REV) & 0xf) << 12); +		bnx2x_set_mdio_clk(bp, chip_id, phy->mdio_ctrl); +	} +  	if (phy->flags & FLAGS_MDC_MDIO_WA_B0)  		bnx2x_bits_en(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_STATUS,  			      EMAC_MDIO_STATUS_10MB); @@ -2719,6 +2781,13 @@ static int bnx2x_cl45_write(struct bnx2x *bp, struct bnx2x_phy *phy,  	u32 tmp;  	u8 i;  	int rc = 0; +	u32 chip_id; +	if (phy->flags & FLAGS_MDC_MDIO_WA_G) { +		chip_id = (REG_RD(bp, MISC_REG_CHIP_NUM) << 16) | +			  ((REG_RD(bp, MISC_REG_CHIP_REV) & 0xf) << 12); +		bnx2x_set_mdio_clk(bp, chip_id, phy->mdio_ctrl); +	} +  	if (phy->flags & FLAGS_MDC_MDIO_WA_B0)  		bnx2x_bits_en(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_STATUS,  			      EMAC_MDIO_STATUS_10MB); @@ -3147,6 +3216,15 @@ static void bnx2x_cl45_read_or_write(struct bnx2x *bp, struct bnx2x_phy *phy,  	bnx2x_cl45_write(bp, phy, devad, reg, val | or_val);  } +static void bnx2x_cl45_read_and_write(struct bnx2x *bp, +				      struct bnx2x_phy *phy, +				      u8 devad, u16 reg, u16 and_val) +{ +	u16 val; +	bnx2x_cl45_read(bp, phy, devad, reg, &val); +	bnx2x_cl45_write(bp, phy, devad, reg, val & and_val); +} +  int bnx2x_phy_read(struct link_params *params, u8 phy_addr,  		   u8 devad, u16 reg, u16 *ret_val)  { @@ -3551,6 +3629,44 @@ static u8 bnx2x_ext_phy_resolve_fc(struct bnx2x_phy *phy,   * init configuration, and set/clear SGMII flag. Internal   * phy init is done purely in phy_init stage.   */ +static void bnx2x_warpcore_enable_AN_KR2(struct bnx2x_phy *phy, +					 struct link_params *params, +					 struct link_vars *vars) +{ +	struct bnx2x *bp = params->bp; +	u16 i; +	static struct bnx2x_reg_set reg_set[] = { +		/* Step 1 - Program the TX/RX alignment markers */ +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL82_USERB1_TX_CTRL5, 0xa157}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL82_USERB1_TX_CTRL7, 0xcbe2}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL82_USERB1_TX_CTRL6, 0x7537}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL82_USERB1_TX_CTRL9, 0xa157}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL82_USERB1_RX_CTRL11, 0xcbe2}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL82_USERB1_RX_CTRL10, 0x7537}, +		/* Step 2 - Configure the NP registers */ +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL73_USERB0_CTRL, 0x000a}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL73_BAM_CTRL1, 0x6400}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL73_BAM_CTRL3, 0x0620}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL73_BAM_CODE_FIELD, 0x0157}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_ETA_CL73_OUI1, 0x6464}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_ETA_CL73_OUI2, 0x3150}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_ETA_CL73_OUI3, 0x3150}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_ETA_CL73_LD_BAM_CODE, 0x0157}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_ETA_CL73_LD_UD_CODE, 0x0620} +	}; +	DP(NETIF_MSG_LINK, "Enabling 20G-KR2\n"); + +	bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, +				 MDIO_WC_REG_CL49_USERB0_CTRL, (3<<6)); + +	for (i = 0; i < sizeof(reg_set)/sizeof(struct bnx2x_reg_set); i++) +		bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg, +				 reg_set[i].val); + +	/* Start KR2 work-around timer which handles BCM8073 link-parner */ +	vars->link_attr_sync |= LINK_ATTR_SYNC_KR2_ENABLE; +	bnx2x_update_link_attr(params, vars->link_attr_sync); +}  static void bnx2x_warpcore_set_lpi_passthrough(struct bnx2x_phy *phy,  					       struct link_params *params) @@ -3564,6 +3680,21 @@ static void bnx2x_warpcore_set_lpi_passthrough(struct bnx2x_phy *phy,  				 MDIO_WC_REG_DIGITAL4_MISC5, 0xc000);  } +static void bnx2x_warpcore_restart_AN_KR(struct bnx2x_phy *phy, +					 struct link_params *params) +{ +	/* Restart autoneg on the leading lane only */ +	struct bnx2x *bp = params->bp; +	u16 lane = bnx2x_get_warpcore_lane(phy, params); +	CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, +			  MDIO_AER_BLOCK_AER_REG, lane); +	bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, +			 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x1200); + +	/* Restore AER */ +	bnx2x_set_aer_mmd(params, phy); +} +  static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,  					struct link_params *params,  					struct link_vars *vars) { @@ -3576,7 +3707,9 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,  		{MDIO_WC_DEVAD, MDIO_WC_REG_RX66_CONTROL, 0x7415},  		{MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_MISC2, 0x6190},  		/* Disable Autoneg: re-enable it after adv is done. */ -		{MDIO_AN_DEVAD, MDIO_WC_REG_IEEE0BLK_MIICNTL, 0} +		{MDIO_AN_DEVAD, MDIO_WC_REG_IEEE0BLK_MIICNTL, 0}, +		{MDIO_PMA_DEVAD, MDIO_WC_REG_PMD_KR_CONTROL, 0x2}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL72_USERB0_CL72_TX_FIR_TAP, 0},  	};  	DP(NETIF_MSG_LINK, "Enable Auto Negotiation for KR\n");  	/* Set to default registers that may be overriden by 10G force */ @@ -3585,11 +3718,11 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,  				 reg_set[i].val);  	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -		MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, &cl72_ctrl); -	cl72_ctrl &= 0xf8ff; +			MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, &cl72_ctrl); +	cl72_ctrl &= 0x08ff;  	cl72_ctrl |= 0x3800;  	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -		MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, cl72_ctrl); +			 MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, cl72_ctrl);  	/* Check adding advertisement for 1G KX */  	if (((vars->line_speed == SPEED_AUTO_NEG) && @@ -3624,6 +3757,16 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,  		     ((0x02 << MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_OFFSET) |  		      (0x06 << MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_OFFSET) |  		      (0x09 << MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_OFFSET))); +	/* Configure the next lane if dual mode */ +	if (phy->flags & FLAGS_WC_DUAL_MODE) +		bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, +				 MDIO_WC_REG_TX0_TX_DRIVER + 0x10*(lane+1), +				 ((0x02 << +				 MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_OFFSET) | +				  (0x06 << +				   MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_OFFSET) | +				  (0x09 << +				MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_OFFSET)));  	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,  			 MDIO_WC_REG_CL72_USERB0_CL72_OS_DEF_CTRL,  			 0x03f0); @@ -3670,10 +3813,26 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,  	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,  			MDIO_WC_REG_DIGITAL3_UP1, 0x1f); -	/* Enable Autoneg */ -	bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, -			 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x1200); +	if (((phy->req_line_speed == SPEED_AUTO_NEG) && +	     (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_20G)) || +	    (phy->req_line_speed == SPEED_20000)) { +		CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, +				  MDIO_AER_BLOCK_AER_REG, lane); + +		bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, +					 MDIO_WC_REG_RX1_PCI_CTRL + (0x10*lane), +					 (1<<11)); + +		bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, +				 MDIO_WC_REG_XGXS_X2_CONTROL3, 0x7); +		bnx2x_set_aer_mmd(params, phy); + +		bnx2x_warpcore_enable_AN_KR2(phy, params, vars); +	} + +	/* Enable Autoneg: only on the main lane */ +	bnx2x_warpcore_restart_AN_KR(phy, params);  }  static void bnx2x_warpcore_set_10G_KR(struct bnx2x_phy *phy, @@ -3692,9 +3851,7 @@ static void bnx2x_warpcore_set_10G_KR(struct bnx2x_phy *phy,  		{MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL3_UP1, 0x1},  		{MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL5_MISC7, 0xa},  		/* Leave cl72 training enable, needed for KR */ -		{MDIO_PMA_DEVAD, -		MDIO_WC_REG_PMD_IEEE9BLK_TENGBASE_KR_PMD_CONTROL_REGISTER_150, -		0x2} +		{MDIO_PMA_DEVAD, MDIO_WC_REG_PMD_KR_CONTROL, 0x2}  	};  	for (i = 0; i < sizeof(reg_set)/sizeof(struct bnx2x_reg_set); i++) @@ -3764,27 +3921,21 @@ static void bnx2x_warpcore_set_10G_XFI(struct bnx2x_phy *phy,  	bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, 0);  	/* Disable 100FX Enable and Auto-Detect */ -	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -			MDIO_WC_REG_FX100_CTRL1, &val); -	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -			 MDIO_WC_REG_FX100_CTRL1, (val & 0xFFFA)); +	bnx2x_cl45_read_and_write(bp, phy, MDIO_WC_DEVAD, +				  MDIO_WC_REG_FX100_CTRL1, 0xFFFA);  	/* Disable 100FX Idle detect */  	bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,  				 MDIO_WC_REG_FX100_CTRL3, 0x0080);  	/* Set Block address to Remote PHY & Clear forced_speed[5] */ -	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -			MDIO_WC_REG_DIGITAL4_MISC3, &val); -	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -			 MDIO_WC_REG_DIGITAL4_MISC3, (val & 0xFF7F)); +	bnx2x_cl45_read_and_write(bp, phy, MDIO_WC_DEVAD, +				  MDIO_WC_REG_DIGITAL4_MISC3, 0xFF7F);  	/* Turn off auto-detect & fiber mode */ -	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -			MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X1, &val); -	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -			 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X1, -			 (val & 0xFFEE)); +	bnx2x_cl45_read_and_write(bp, phy, MDIO_WC_DEVAD, +				  MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X1, +				  0xFFEE);  	/* Set filter_force_link, disable_false_link and parallel_detect */  	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, @@ -3846,22 +3997,65 @@ static void bnx2x_warpcore_set_10G_XFI(struct bnx2x_phy *phy,  			 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x100);  	/* Release tx_fifo_reset */ +	bnx2x_cl45_read_and_write(bp, phy, MDIO_WC_DEVAD, +				  MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X3, +				  0xFFFE); +	/* Release rxSeqStart */ +	bnx2x_cl45_read_and_write(bp, phy, MDIO_WC_DEVAD, +				  MDIO_WC_REG_DSC2B0_DSC_MISC_CTRL0, 0x7FFF); +} + +static void bnx2x_warpcore_set_20G_force_KR2(struct bnx2x_phy *phy, +					     struct link_params *params) +{ +	u16 val; +	struct bnx2x *bp = params->bp; +	/* Set global registers, so set AER lane to 0 */ +	CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, +			  MDIO_AER_BLOCK_AER_REG, 0); + +	/* Disable sequencer */ +	bnx2x_cl45_read_and_write(bp, phy, MDIO_WC_DEVAD, +				  MDIO_WC_REG_XGXSBLK0_XGXSCONTROL, ~(1<<13)); + +	bnx2x_set_aer_mmd(params, phy); + +	bnx2x_cl45_read_and_write(bp, phy, MDIO_PMA_DEVAD, +				  MDIO_WC_REG_PMD_KR_CONTROL, ~(1<<1)); +	bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, +			 MDIO_AN_REG_CTRL, 0); +	/* Turn off CL73 */  	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -			MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X3, &val); +			MDIO_WC_REG_CL73_USERB0_CTRL, &val); +	val &= ~(1<<5); +	val |= (1<<6);  	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -			 MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X3, val & 0xFFFE); +			 MDIO_WC_REG_CL73_USERB0_CTRL, val); + +	/* Set 20G KR2 force speed */ +	bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, +				 MDIO_WC_REG_SERDESDIGITAL_MISC1, 0x1f); + +	bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, +				 MDIO_WC_REG_DIGITAL4_MISC3, (1<<7)); -	/* Release rxSeqStart */  	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -			MDIO_WC_REG_DSC2B0_DSC_MISC_CTRL0, &val); +			MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, &val); +	val &= ~(3<<14); +	val |= (1<<15);  	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -			 MDIO_WC_REG_DSC2B0_DSC_MISC_CTRL0, (val & 0x7FFF)); -} +			 MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, val); +	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, +			 MDIO_WC_REG_CL72_USERB0_CL72_TX_FIR_TAP, 0x835A); -static void bnx2x_warpcore_set_20G_KR2(struct bnx2x *bp, -				       struct bnx2x_phy *phy) -{ -	DP(NETIF_MSG_LINK, "KR2 still not supported !!!\n"); +	/* Enable sequencer (over lane 0) */ +	CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, +			  MDIO_AER_BLOCK_AER_REG, 0); + +	bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, +				 MDIO_WC_REG_XGXSBLK0_XGXSCONTROL, (1<<13)); + +	bnx2x_set_aer_mmd(params, phy);  }  static void bnx2x_warpcore_set_20G_DXGXS(struct bnx2x *bp, @@ -3931,20 +4125,16 @@ static void bnx2x_warpcore_set_sgmii_speed(struct bnx2x_phy *phy,  	u16 val16, digctrl_kx1, digctrl_kx2;  	/* Clear XFI clock comp in non-10G single lane mode. */ -	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -			MDIO_WC_REG_RX66_CONTROL, &val16); -	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -			 MDIO_WC_REG_RX66_CONTROL, val16 & ~(3<<13)); +	bnx2x_cl45_read_and_write(bp, phy, MDIO_WC_DEVAD, +				  MDIO_WC_REG_RX66_CONTROL, ~(3<<13));  	bnx2x_warpcore_set_lpi_passthrough(phy, params);  	if (always_autoneg || phy->req_line_speed == SPEED_AUTO_NEG) {  		/* SGMII Autoneg */ -		bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -				MDIO_WC_REG_COMBO_IEEE0_MIICTRL, &val16); -		bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -				 MDIO_WC_REG_COMBO_IEEE0_MIICTRL, -				 val16 | 0x1000); +		bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, +					 MDIO_WC_REG_COMBO_IEEE0_MIICTRL, +					 0x1000);  		DP(NETIF_MSG_LINK, "set SGMII AUTONEG\n");  	} else {  		bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, @@ -4086,7 +4276,7 @@ static int bnx2x_get_mod_abs_int_cfg(struct bnx2x *bp,  		if ((cfg_pin < PIN_CFG_GPIO0_P0) ||  		    (cfg_pin > PIN_CFG_GPIO3_P1)) {  			DP(NETIF_MSG_LINK, -			   "ERROR: Invalid cfg pin %x for module detect indication\n", +			   "No cfg pin %x for module detect indication\n",  			   cfg_pin);  			return -EINVAL;  		} @@ -4097,7 +4287,7 @@ static int bnx2x_get_mod_abs_int_cfg(struct bnx2x *bp,  		*gpio_num = MISC_REGISTERS_GPIO_3;  		*gpio_port = port;  	} -	DP(NETIF_MSG_LINK, "MOD_ABS int GPIO%d_P%d\n", *gpio_num, *gpio_port); +  	return 0;  } @@ -4120,7 +4310,7 @@ static int bnx2x_is_sfp_module_plugged(struct bnx2x_phy *phy,  		return 0;  }  static int bnx2x_warpcore_get_sigdet(struct bnx2x_phy *phy, -					struct link_params *params) +				     struct link_params *params)  {  	u16 gp2_status_reg0, lane;  	struct bnx2x *bp = params->bp; @@ -4134,8 +4324,8 @@ static int bnx2x_warpcore_get_sigdet(struct bnx2x_phy *phy,  }  static void bnx2x_warpcore_config_runtime(struct bnx2x_phy *phy, -				       struct link_params *params, -				       struct link_vars *vars) +					  struct link_params *params, +					  struct link_vars *vars)  {  	struct bnx2x *bp = params->bp;  	u32 serdes_net_if; @@ -4163,7 +4353,7 @@ static void bnx2x_warpcore_config_runtime(struct bnx2x_phy *phy,  		case PORT_HW_CFG_NET_SERDES_IF_KR:  			/* Do we get link yet? */  			bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 0x81d1, -								&gp_status1); +					&gp_status1);  			lnkup = (gp_status1 >> (8+lane)) & 0x1;/* 1G */  				/*10G KR*/  			lnkup_kr = (gp_status1 >> (12+lane)) & 0x1; @@ -4215,6 +4405,27 @@ static void bnx2x_warpcore_config_sfi(struct bnx2x_phy *phy,  	}  } +static void bnx2x_sfp_e3_set_transmitter(struct link_params *params, +					 struct bnx2x_phy *phy, +					 u8 tx_en) +{ +	struct bnx2x *bp = params->bp; +	u32 cfg_pin; +	u8 port = params->port; + +	cfg_pin = REG_RD(bp, params->shmem_base + +			 offsetof(struct shmem_region, +				  dev_info.port_hw_config[port].e3_sfp_ctrl)) & +		PORT_HW_CFG_E3_TX_LASER_MASK; +	/* Set the !tx_en since this pin is DISABLE_TX_LASER */ +	DP(NETIF_MSG_LINK, "Setting WC TX to %d\n", tx_en); + +	/* For 20G, the expected pin to be used is 3 pins after the current */ +	bnx2x_set_cfg_pin(bp, cfg_pin, tx_en ^ 1); +	if (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_20G) +		bnx2x_set_cfg_pin(bp, cfg_pin + 3, tx_en ^ 1); +} +  static void bnx2x_warpcore_config_init(struct bnx2x_phy *phy,  				       struct link_params *params,  				       struct link_vars *vars) @@ -4275,9 +4486,14 @@ static void bnx2x_warpcore_config_init(struct bnx2x_phy *phy,  			break;  		case PORT_HW_CFG_NET_SERDES_IF_SFI: -			/* Issue Module detection */ +			/* Issue Module detection if module is plugged, or +			 * enabled transmitter to avoid current leakage in case +			 * no module is connected +			 */  			if (bnx2x_is_sfp_module_plugged(phy, params))  				bnx2x_sfp_module_detection(phy, params); +			else +				bnx2x_sfp_e3_set_transmitter(params, phy, 1);  			bnx2x_warpcore_config_sfi(phy, params);  			break; @@ -4293,16 +4509,14 @@ static void bnx2x_warpcore_config_init(struct bnx2x_phy *phy,  			bnx2x_sfp_module_detection(phy, params);  			break; -  		case PORT_HW_CFG_NET_SERDES_IF_KR2: -			if (vars->line_speed != SPEED_20000) { -				DP(NETIF_MSG_LINK, "Speed not supported yet\n"); -				return; +			if (!params->loopback_mode) { +				bnx2x_warpcore_enable_AN_KR(phy, params, vars); +			} else { +				DP(NETIF_MSG_LINK, "Setting KR 20G-Force\n"); +				bnx2x_warpcore_set_20G_force_KR2(phy, params);  			} -			DP(NETIF_MSG_LINK, "Setting 20G KR2\n"); -			bnx2x_warpcore_set_20G_KR2(bp, phy);  			break; -  		default:  			DP(NETIF_MSG_LINK,  			   "Unsupported Serdes Net Interface 0x%x\n", @@ -4316,68 +4530,35 @@ static void bnx2x_warpcore_config_init(struct bnx2x_phy *phy,  	DP(NETIF_MSG_LINK, "Exit config init\n");  } -static void bnx2x_sfp_e3_set_transmitter(struct link_params *params, -					 struct bnx2x_phy *phy, -					 u8 tx_en) -{ -	struct bnx2x *bp = params->bp; -	u32 cfg_pin; -	u8 port = params->port; - -	cfg_pin = REG_RD(bp, params->shmem_base + -				offsetof(struct shmem_region, -				dev_info.port_hw_config[port].e3_sfp_ctrl)) & -				PORT_HW_CFG_TX_LASER_MASK; -	/* Set the !tx_en since this pin is DISABLE_TX_LASER */ -	DP(NETIF_MSG_LINK, "Setting WC TX to %d\n", tx_en); -	/* For 20G, the expected pin to be used is 3 pins after the current */ - -	bnx2x_set_cfg_pin(bp, cfg_pin, tx_en ^ 1); -	if (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_20G) -		bnx2x_set_cfg_pin(bp, cfg_pin + 3, tx_en ^ 1); -} -  static void bnx2x_warpcore_link_reset(struct bnx2x_phy *phy,  				      struct link_params *params)  {  	struct bnx2x *bp = params->bp;  	u16 val16, lane;  	bnx2x_sfp_e3_set_transmitter(params, phy, 0); -	bnx2x_set_mdio_clk(bp, params->chip_id, params->port); +	bnx2x_set_mdio_emac_per_phy(bp, params);  	bnx2x_set_aer_mmd(params, phy);  	/* Global register */  	bnx2x_warpcore_reset_lane(bp, phy, 1);  	/* Clear loopback settings (if any) */  	/* 10G & 20G */ -	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -			MDIO_WC_REG_COMBO_IEEE0_MIICTRL, &val16); -	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -			 MDIO_WC_REG_COMBO_IEEE0_MIICTRL, val16 & -			 0xBFFF); +	bnx2x_cl45_read_and_write(bp, phy, MDIO_WC_DEVAD, +				  MDIO_WC_REG_COMBO_IEEE0_MIICTRL, 0xBFFF); -	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -			MDIO_WC_REG_IEEE0BLK_MIICNTL, &val16); -	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -			MDIO_WC_REG_IEEE0BLK_MIICNTL, val16 & 0xfffe); +	bnx2x_cl45_read_and_write(bp, phy, MDIO_WC_DEVAD, +				  MDIO_WC_REG_IEEE0BLK_MIICNTL, 0xfffe);  	/* Update those 1-copy registers */  	CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK,  			  MDIO_AER_BLOCK_AER_REG, 0);  	/* Enable 1G MDIO (1-copy) */ -	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -			MDIO_WC_REG_XGXSBLK0_XGXSCONTROL, -			&val16); -	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -			 MDIO_WC_REG_XGXSBLK0_XGXSCONTROL, -			 val16 & ~0x10); - -	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -			MDIO_WC_REG_XGXSBLK1_LANECTRL2, &val16); -	bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -			 MDIO_WC_REG_XGXSBLK1_LANECTRL2, -			 val16 & 0xff00); +	bnx2x_cl45_read_and_write(bp, phy, MDIO_WC_DEVAD, +				  MDIO_WC_REG_XGXSBLK0_XGXSCONTROL, +				  ~0x10); +	bnx2x_cl45_read_and_write(bp, phy, MDIO_WC_DEVAD, +				  MDIO_WC_REG_XGXSBLK1_LANECTRL2, 0xff00);  	lane = bnx2x_get_warpcore_lane(phy, params);  	/* Disable CL36 PCS Tx */  	bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, @@ -4413,8 +4594,9 @@ static void bnx2x_set_warpcore_loopback(struct bnx2x_phy *phy,  	DP(NETIF_MSG_LINK, "Setting Warpcore loopback type %x, speed %d\n",  		       params->loopback_mode, phy->req_line_speed); -	if (phy->req_line_speed < SPEED_10000) { -		/* 10/100/1000 */ +	if (phy->req_line_speed < SPEED_10000 || +	    phy->supported & SUPPORTED_20000baseKR2_Full) { +		/* 10/100/1000/20G-KR2 */  		/* Update those 1-copy registers */  		CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, @@ -4427,18 +4609,20 @@ static void bnx2x_set_warpcore_loopback(struct bnx2x_phy *phy,  		lane = bnx2x_get_warpcore_lane(phy, params);  		bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD,  				MDIO_WC_REG_XGXSBLK1_LANECTRL2, &val16); +		val16 |= (1<<lane); +		if (phy->flags & FLAGS_WC_DUAL_MODE) +			val16 |= (2<<lane);  		bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -				MDIO_WC_REG_XGXSBLK1_LANECTRL2, -				val16 | (1<<lane)); +				 MDIO_WC_REG_XGXSBLK1_LANECTRL2, +				 val16);  		/* Switch back to 4-copy registers */  		bnx2x_set_aer_mmd(params, phy);  	} else { -		/* 10G & 20G */ +		/* 10G / 20G-DXGXS */  		bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,  					 MDIO_WC_REG_COMBO_IEEE0_MIICTRL,  					 0x4000); -  		bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,  					 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x1);  	} @@ -4603,6 +4787,10 @@ void bnx2x_link_status_update(struct link_params *params,  		params->feature_config_flags &=  					~FEATURE_CONFIG_PFC_ENABLED; +	if (SHMEM2_HAS(bp, link_attr_sync)) +		vars->link_attr_sync = SHMEM2_RD(bp, +						 link_attr_sync[params->port]); +  	DP(NETIF_MSG_LINK, "link_status 0x%x  phy_link_up %x int_mask 0x%x\n",  		 vars->link_status, vars->phy_link_up, vars->aeu_int_mask);  	DP(NETIF_MSG_LINK, "line_speed %x  duplex %x  flow_ctrl 0x%x\n", @@ -5332,6 +5520,7 @@ static int bnx2x_get_link_speed_duplex(struct bnx2x_phy *phy,  			vars->link_status |= LINK_10GTFD;  			break;  		case GP_STATUS_20G_DXGXS: +		case GP_STATUS_20G_KR2:  			vars->line_speed = SPEED_20000;  			vars->link_status |= LINK_20GTFD;  			break; @@ -5439,7 +5628,15 @@ static int bnx2x_warpcore_read_status(struct bnx2x_phy *phy,  	int rc = 0;  	lane = bnx2x_get_warpcore_lane(phy, params);  	/* Read gp_status */ -	if (phy->req_line_speed > SPEED_10000) { +	if ((params->loopback_mode) && +	    (phy->flags & FLAGS_WC_DUAL_MODE)) { +		bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, +				MDIO_WC_REG_DIGITAL5_LINK_STATUS, &link_up); +		bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, +				MDIO_WC_REG_DIGITAL5_LINK_STATUS, &link_up); +		link_up &= 0x1; +	} else if ((phy->req_line_speed > SPEED_10000) && +		(phy->supported & SUPPORTED_20000baseMLD2_Full)) {  		u16 temp_link_up;  		bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD,  				1, &temp_link_up); @@ -5452,12 +5649,22 @@ static int bnx2x_warpcore_read_status(struct bnx2x_phy *phy,  			bnx2x_ext_phy_resolve_fc(phy, params, vars);  	} else {  		bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, -				MDIO_WC_REG_GP2_STATUS_GP_2_1, &gp_status1); +				MDIO_WC_REG_GP2_STATUS_GP_2_1, +				&gp_status1);  		DP(NETIF_MSG_LINK, "0x81d1 = 0x%x\n", gp_status1); -		/* Check for either KR or generic link up. */ -		gp_status1 = ((gp_status1 >> 8) & 0xf) | -			((gp_status1 >> 12) & 0xf); -		link_up = gp_status1 & (1 << lane); +		/* Check for either KR, 1G, or AN up. */ +		link_up = ((gp_status1 >> 8) | +			   (gp_status1 >> 12) | +			   (gp_status1)) & +			(1 << lane); +		if (phy->supported & SUPPORTED_20000baseKR2_Full) { +			u16 an_link; +			bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, +					MDIO_AN_REG_STATUS, &an_link); +			bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, +					MDIO_AN_REG_STATUS, &an_link); +			link_up |= (an_link & (1<<2)); +		}  		if (link_up && SINGLE_MEDIA_DIRECT(params)) {  			u16 pd, gp_status4;  			if (phy->req_line_speed == SPEED_AUTO_NEG) { @@ -5522,7 +5729,7 @@ static int bnx2x_warpcore_read_status(struct bnx2x_phy *phy,  	if ((lane & 1) == 0)  		gp_speed <<= 8;  	gp_speed &= 0x3f00; - +	link_up = !!link_up;  	rc = bnx2x_get_link_speed_duplex(phy, params, vars, link_up, gp_speed,  					 duplex); @@ -6683,7 +6890,7 @@ int bnx2x_link_update(struct link_params *params, struct link_vars *vars)  		} else if (prev_line_speed != vars->line_speed) {  			REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4,  			       0); -			 usleep_range(1000, 2000); +			usleep_range(1000, 2000);  		}  	} @@ -6753,7 +6960,7 @@ void bnx2x_ext_phy_hw_reset(struct bnx2x *bp, u8 port)  {  	bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1,  		       MISC_REGISTERS_GPIO_OUTPUT_LOW, port); -	 usleep_range(1000, 2000); +	usleep_range(1000, 2000);  	bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1,  		       MISC_REGISTERS_GPIO_OUTPUT_HIGH, port);  } @@ -6894,7 +7101,7 @@ static int bnx2x_8073_8727_external_rom_boot(struct bnx2x *bp,  				MDIO_PMA_DEVAD,  				MDIO_PMA_REG_M8051_MSGOUT_REG, &fw_msgout); -		 usleep_range(1000, 2000); +		usleep_range(1000, 2000);  	} while (fw_ver1 == 0 || fw_ver1 == 0x4321 ||  			((fw_msgout & 0xff) != 0x03 && (phy->type ==  			PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073))); @@ -7604,13 +7811,12 @@ static int bnx2x_8726_read_sfp_module_eeprom(struct bnx2x_phy *phy,  		if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) ==  		    MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_IDLE)  			return 0; -		 usleep_range(1000, 2000); +		usleep_range(1000, 2000);  	}  	return -EINVAL;  }  static void bnx2x_warpcore_power_module(struct link_params *params, -					struct bnx2x_phy *phy,  					u8 power)  {  	u32 pin_cfg; @@ -7652,10 +7858,10 @@ static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy,  	addr32 = addr & (~0x3);  	do {  		if ((!is_init) && (cnt == I2C_WA_PWR_ITER)) { -			bnx2x_warpcore_power_module(params, phy, 0); +			bnx2x_warpcore_power_module(params, 0);  			/* Note that 100us are not enough here */  			usleep_range(1000, 2000); -			bnx2x_warpcore_power_module(params, phy, 1); +			bnx2x_warpcore_power_module(params, 1);  		}  		rc = bnx2x_bsc_read(params, phy, 0xa0, addr32, 0, byte_cnt,  				    data_array); @@ -7715,7 +7921,7 @@ static int bnx2x_8727_read_sfp_module_eeprom(struct bnx2x_phy *phy,  	/* Wait appropriate time for two-wire command to finish before  	 * polling the status register  	 */ -	 usleep_range(1000, 2000); +	usleep_range(1000, 2000);  	/* Wait up to 500us for command complete status */  	for (i = 0; i < 100; i++) { @@ -7751,7 +7957,7 @@ static int bnx2x_8727_read_sfp_module_eeprom(struct bnx2x_phy *phy,  		if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) ==  		    MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_IDLE)  			return 0; -		 usleep_range(1000, 2000); +		usleep_range(1000, 2000);  	}  	return -EINVAL; @@ -7786,9 +7992,8 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy,  {  	struct bnx2x *bp = params->bp;  	u32 sync_offset = 0, phy_idx, media_types; -	u8 val[2], check_limiting_mode = 0; +	u8 gport, val[2], check_limiting_mode = 0;  	*edc_mode = EDC_MODE_LIMITING; -  	phy->media_type = ETH_PHY_UNSPECIFIED;  	/* First check for copper cable */  	if (bnx2x_read_sfp_module_eeprom(phy, @@ -7843,8 +8048,15 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy,  			       SFP_EEPROM_COMP_CODE_LR_MASK |  			       SFP_EEPROM_COMP_CODE_LRM_MASK)) == 0) {  			DP(NETIF_MSG_LINK, "1G Optic module detected\n"); +			gport = params->port;  			phy->media_type = ETH_PHY_SFP_1G_FIBER;  			phy->req_line_speed = SPEED_1000; +			if (!CHIP_IS_E1x(bp)) +				gport = BP_PATH(bp) + (params->port << 1); +			netdev_err(bp->dev, "Warning: Link speed was forced to 1000Mbps." +			      " Current SFP module in port %d is not" +			      " compliant with 10G Ethernet\n", +			 gport);  		} else {  			int idx, cfg_idx = 0;  			DP(NETIF_MSG_LINK, "10G Optic module detected\n"); @@ -8241,7 +8453,7 @@ static void bnx2x_warpcore_hw_reset(struct bnx2x_phy *phy,  				    struct link_params *params)  {  	struct bnx2x *bp = params->bp; -	bnx2x_warpcore_power_module(params, phy, 0); +	bnx2x_warpcore_power_module(params, 0);  	/* Put Warpcore in low power mode */  	REG_WR(bp, MISC_REG_WC0_RESET, 0x0c0e); @@ -8264,7 +8476,7 @@ static void bnx2x_power_sfp_module(struct link_params *params,  		bnx2x_8727_power_module(params->bp, phy, power);  		break;  	case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT: -		bnx2x_warpcore_power_module(params, phy, power); +		bnx2x_warpcore_power_module(params, power);  		break;  	default:  		break; @@ -8337,7 +8549,8 @@ int bnx2x_sfp_module_detection(struct bnx2x_phy *phy,  	u32 val = REG_RD(bp, params->shmem_base +  			     offsetof(struct shmem_region, dev_info.  				     port_feature_config[params->port].config)); - +	/* Enabled transmitter by default */ +	bnx2x_sfp_set_transmitter(params, phy, 1);  	DP(NETIF_MSG_LINK, "SFP+ module plugged in/out detected on port %d\n",  		 params->port);  	/* Power up module */ @@ -8370,14 +8583,12 @@ int bnx2x_sfp_module_detection(struct bnx2x_phy *phy,  	 */  	bnx2x_set_limiting_mode(params, phy, edc_mode); -	/* Enable transmit for this module if the module is approved, or -	 * if unapproved modules should also enable the Tx laser +	/* Disable transmit for this module if the module is not approved, and +	 * laser needs to be disabled.  	 */ -	if (rc == 0 || -	    (val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) != -	    PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER) -		bnx2x_sfp_set_transmitter(params, phy, 1); -	else +	if ((rc) && +	    ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) == +	     PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER))  		bnx2x_sfp_set_transmitter(params, phy, 0);  	return rc; @@ -8389,11 +8600,13 @@ void bnx2x_handle_module_detect_int(struct link_params *params)  	struct bnx2x_phy *phy;  	u32 gpio_val;  	u8 gpio_num, gpio_port; -	if (CHIP_IS_E3(bp)) +	if (CHIP_IS_E3(bp)) {  		phy = ¶ms->phy[INT_PHY]; -	else +		/* Always enable TX laser,will be disabled in case of fault */ +		bnx2x_sfp_set_transmitter(params, phy, 1); +	} else {  		phy = ¶ms->phy[EXT_PHY1]; - +	}  	if (bnx2x_get_mod_abs_int_cfg(bp, params->chip_id, params->shmem_base,  				      params->port, &gpio_num, &gpio_port) ==  	    -EINVAL) { @@ -8409,7 +8622,7 @@ void bnx2x_handle_module_detect_int(struct link_params *params)  	/* Call the handling function in case module is detected */  	if (gpio_val == 0) { -		bnx2x_set_mdio_clk(bp, params->chip_id, params->port); +		bnx2x_set_mdio_emac_per_phy(bp, params);  		bnx2x_set_aer_mmd(params, phy);  		bnx2x_power_sfp_module(params, phy, 1); @@ -8438,10 +8651,6 @@ void bnx2x_handle_module_detect_int(struct link_params *params)  			DP(NETIF_MSG_LINK, "SFP+ module is not initialized\n");  		}  	} else { -		u32 val = REG_RD(bp, params->shmem_base + -				 offsetof(struct shmem_region, dev_info. -					  port_feature_config[params->port]. -					  config));  		bnx2x_set_gpio_int(bp, gpio_num,  				   MISC_REGISTERS_GPIO_INT_OUTPUT_SET,  				   gpio_port); @@ -8449,10 +8658,6 @@ void bnx2x_handle_module_detect_int(struct link_params *params)  		 * Disable transmit for this module  		 */  		phy->media_type = ETH_PHY_NOT_PRESENT; -		if (((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) == -		     PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER) || -		    CHIP_IS_E3(bp)) -			bnx2x_sfp_set_transmitter(params, phy, 0);  	}  } @@ -9192,6 +9397,7 @@ static u8 bnx2x_8727_read_status(struct bnx2x_phy *phy,  			bnx2x_cl45_read(bp, phy,  				MDIO_PMA_DEVAD,  				MDIO_PMA_LASI_RXSTAT, &rx_alarm_status); +			bnx2x_8727_power_module(params->bp, phy, 0);  			return 0;  		}  	} /* Over current check */ @@ -9296,20 +9502,28 @@ static void bnx2x_save_848xx_spirom_version(struct bnx2x_phy *phy,  					    struct bnx2x *bp,  					    u8 port)  { -	u16 val, fw_ver1, fw_ver2, cnt; +	u16 val, fw_ver2, cnt, i; +	static struct bnx2x_reg_set reg_set[] = { +		{MDIO_PMA_DEVAD, 0xA819, 0x0014}, +		{MDIO_PMA_DEVAD, 0xA81A, 0xc200}, +		{MDIO_PMA_DEVAD, 0xA81B, 0x0000}, +		{MDIO_PMA_DEVAD, 0xA81C, 0x0300}, +		{MDIO_PMA_DEVAD, 0xA817, 0x0009} +	}; +	u16 fw_ver1; -	if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) { +	if ((phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) || +	    (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834)) {  		bnx2x_cl45_read(bp, phy, MDIO_CTL_DEVAD, 0x400f, &fw_ver1);  		bnx2x_save_spirom_version(bp, port, fw_ver1 & 0xfff,  				phy->ver_addr);  	} else {  		/* For 32-bit registers in 848xx, access via MDIO2ARM i/f. */  		/* (1) set reg 0xc200_0014(SPI_BRIDGE_CTRL_2) to 0x03000000 */ -		bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 0xA819, 0x0014); -		bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 0xA81A, 0xc200); -		bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 0xA81B, 0x0000); -		bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 0xA81C, 0x0300); -		bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 0xA817, 0x0009); +		for (i = 0; i < sizeof(reg_set)/sizeof(struct bnx2x_reg_set); +		      i++) +			bnx2x_cl45_write(bp, phy, reg_set[i].devad, +					 reg_set[i].reg, reg_set[i].val);  		for (cnt = 0; cnt < 100; cnt++) {  			bnx2x_cl45_read(bp, phy, MDIO_PMA_DEVAD, 0xA818, &val); @@ -9357,8 +9571,16 @@ static void bnx2x_save_848xx_spirom_version(struct bnx2x_phy *phy,  static void bnx2x_848xx_set_led(struct bnx2x *bp,  				struct bnx2x_phy *phy)  { -	u16 val, offset; - +	u16 val, offset, i; +	static struct bnx2x_reg_set reg_set[] = { +		{MDIO_PMA_DEVAD, MDIO_PMA_REG_8481_LED1_MASK, 0x0080}, +		{MDIO_PMA_DEVAD, MDIO_PMA_REG_8481_LED2_MASK, 0x0018}, +		{MDIO_PMA_DEVAD, MDIO_PMA_REG_8481_LED3_MASK, 0x0006}, +		{MDIO_PMA_DEVAD, MDIO_PMA_REG_8481_LED3_BLINK, 0x0000}, +		{MDIO_PMA_DEVAD, MDIO_PMA_REG_84823_CTL_SLOW_CLK_CNT_HIGH, +			MDIO_PMA_REG_84823_BLINK_RATE_VAL_15P9HZ}, +		{MDIO_AN_DEVAD, 0xFFFB, 0xFFFD} +	};  	/* PHYC_CTL_LED_CTL */  	bnx2x_cl45_read(bp, phy,  			MDIO_PMA_DEVAD, @@ -9370,49 +9592,20 @@ static void bnx2x_848xx_set_led(struct bnx2x *bp,  			 MDIO_PMA_DEVAD,  			 MDIO_PMA_REG_8481_LINK_SIGNAL, val); -	bnx2x_cl45_write(bp, phy, -			 MDIO_PMA_DEVAD, -			 MDIO_PMA_REG_8481_LED1_MASK, -			 0x80); - -	bnx2x_cl45_write(bp, phy, -			 MDIO_PMA_DEVAD, -			 MDIO_PMA_REG_8481_LED2_MASK, -			 0x18); - -	/* Select activity source by Tx and Rx, as suggested by PHY AE */ -	bnx2x_cl45_write(bp, phy, -			 MDIO_PMA_DEVAD, -			 MDIO_PMA_REG_8481_LED3_MASK, -			 0x0006); - -	/* Select the closest activity blink rate to that in 10/100/1000 */ -	bnx2x_cl45_write(bp, phy, -			MDIO_PMA_DEVAD, -			MDIO_PMA_REG_8481_LED3_BLINK, -			0); - -	/* Configure the blink rate to ~15.9 Hz */ -	bnx2x_cl45_write(bp, phy, -			MDIO_PMA_DEVAD, -			MDIO_PMA_REG_84823_CTL_SLOW_CLK_CNT_HIGH, -			MDIO_PMA_REG_84823_BLINK_RATE_VAL_15P9HZ); +	for (i = 0; i < sizeof(reg_set)/sizeof(struct bnx2x_reg_set); i++) +		bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg, +				 reg_set[i].val); -	if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) +	if ((phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) || +	    (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834))  		offset = MDIO_PMA_REG_84833_CTL_LED_CTL_1;  	else  		offset = MDIO_PMA_REG_84823_CTL_LED_CTL_1; -	bnx2x_cl45_read(bp, phy, -			MDIO_PMA_DEVAD, offset, &val); -	val |= MDIO_PMA_REG_84823_LED3_STRETCH_EN; /* stretch_en for LED3*/ -	bnx2x_cl45_write(bp, phy, -			 MDIO_PMA_DEVAD, offset, val); - -	/* 'Interrupt Mask' */ -	bnx2x_cl45_write(bp, phy, -			 MDIO_AN_DEVAD, -			 0xFFFB, 0xFFFD); +	/* stretch_en for LED3*/ +	bnx2x_cl45_read_or_write(bp, phy, +				 MDIO_PMA_DEVAD, offset, +				 MDIO_PMA_REG_84823_LED3_STRETCH_EN);  }  static void bnx2x_848xx_specific_func(struct bnx2x_phy *phy, @@ -9422,7 +9615,8 @@ static void bnx2x_848xx_specific_func(struct bnx2x_phy *phy,  	struct bnx2x *bp = params->bp;  	switch (action) {  	case PHY_INIT: -		if (phy->type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) { +		if ((phy->type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) && +		    (phy->type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834)) {  			/* Save spirom version */  			bnx2x_save_848xx_spirom_version(phy, bp, params->port);  		} @@ -9443,7 +9637,7 @@ static int bnx2x_848xx_cmn_config_init(struct bnx2x_phy *phy,  				       struct link_vars *vars)  {  	struct bnx2x *bp = params->bp; -	u16 autoneg_val, an_1000_val, an_10_100_val, an_10g_val; +	u16 autoneg_val, an_1000_val, an_10_100_val;  	bnx2x_848xx_specific_func(phy, params, PHY_INIT);  	bnx2x_cl45_write(bp, phy, @@ -9542,11 +9736,12 @@ static int bnx2x_848xx_cmn_config_init(struct bnx2x_phy *phy,  	if (phy->req_duplex == DUPLEX_FULL)  		autoneg_val |= (1<<8); -	/* Always write this if this is not 84833. -	 * For 84833, write it only when it's a forced speed. +	/* Always write this if this is not 84833/4. +	 * For 84833/4, write it only when it's a forced speed.  	 */ -	if ((phy->type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) || -		((autoneg_val & (1<<12)) == 0)) +	if (((phy->type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) && +	     (phy->type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834)) || +	    ((autoneg_val & (1<<12)) == 0))  		bnx2x_cl45_write(bp, phy,  			 MDIO_AN_DEVAD,  			 MDIO_AN_REG_8481_LEGACY_MII_CTRL, autoneg_val); @@ -9558,14 +9753,11 @@ static int bnx2x_848xx_cmn_config_init(struct bnx2x_phy *phy,  			DP(NETIF_MSG_LINK, "Advertising 10G\n");  			/* Restart autoneg for 10G*/ -			bnx2x_cl45_read(bp, phy, -					MDIO_AN_DEVAD, -					MDIO_AN_REG_8481_10GBASE_T_AN_CTRL, -					&an_10g_val); -			bnx2x_cl45_write(bp, phy, -					 MDIO_AN_DEVAD, -					 MDIO_AN_REG_8481_10GBASE_T_AN_CTRL, -					 an_10g_val | 0x1000); +			bnx2x_cl45_read_or_write( +				bp, phy, +				MDIO_AN_DEVAD, +				MDIO_AN_REG_8481_10GBASE_T_AN_CTRL, +				0x1000);  			bnx2x_cl45_write(bp, phy,  					 MDIO_AN_DEVAD, MDIO_AN_REG_CTRL,  					 0x3200); @@ -9598,9 +9790,8 @@ static int bnx2x_8481_config_init(struct bnx2x_phy *phy,  #define PHY84833_CMDHDLR_WAIT 300  #define PHY84833_CMDHDLR_MAX_ARGS 5  static int bnx2x_84833_cmd_hdlr(struct bnx2x_phy *phy, -				   struct link_params *params, -		   u16 fw_cmd, -		   u16 cmd_args[], int argc) +				struct link_params *params, u16 fw_cmd, +				u16 cmd_args[], int argc)  {  	int idx;  	u16 val; @@ -9614,7 +9805,7 @@ static int bnx2x_84833_cmd_hdlr(struct bnx2x_phy *phy,  				MDIO_84833_CMD_HDLR_STATUS, &val);  		if (val == PHY84833_STATUS_CMD_OPEN_FOR_CMDS)  			break; -		 usleep_range(1000, 2000); +		usleep_range(1000, 2000);  	}  	if (idx >= PHY84833_CMDHDLR_WAIT) {  		DP(NETIF_MSG_LINK, "FW cmd: FW not ready.\n"); @@ -9635,7 +9826,7 @@ static int bnx2x_84833_cmd_hdlr(struct bnx2x_phy *phy,  		if ((val == PHY84833_STATUS_CMD_COMPLETE_PASS) ||  			(val == PHY84833_STATUS_CMD_COMPLETE_ERROR))  			break; -		 usleep_range(1000, 2000); +		usleep_range(1000, 2000);  	}  	if ((idx >= PHY84833_CMDHDLR_WAIT) ||  		(val == PHY84833_STATUS_CMD_COMPLETE_ERROR)) { @@ -9654,7 +9845,6 @@ static int bnx2x_84833_cmd_hdlr(struct bnx2x_phy *phy,  	return 0;  } -  static int bnx2x_84833_pair_swap_cfg(struct bnx2x_phy *phy,  				   struct link_params *params,  				   struct link_vars *vars) @@ -9802,11 +9992,11 @@ static int bnx2x_848x3_config_init(struct bnx2x_phy *phy,  	struct bnx2x *bp = params->bp;  	u8 port, initialize = 1;  	u16 val; -	u32 actual_phy_selection, cms_enable; +	u32 actual_phy_selection;  	u16 cmd_args[PHY84833_CMDHDLR_MAX_ARGS];  	int rc = 0; -	 usleep_range(1000, 2000); +	usleep_range(1000, 2000);  	if (!(CHIP_IS_E1x(bp)))  		port = BP_PATH(bp); @@ -9828,7 +10018,8 @@ static int bnx2x_848x3_config_init(struct bnx2x_phy *phy,  	/* Wait for GPHY to come out of reset */  	msleep(50); -	if (phy->type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) { +	if ((phy->type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) && +	    (phy->type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834)) {  		/* BCM84823 requires that XGXS links up first @ 10G for normal  		 * behavior.  		 */ @@ -9884,7 +10075,8 @@ static int bnx2x_848x3_config_init(struct bnx2x_phy *phy,  	DP(NETIF_MSG_LINK, "Multi_phy config = 0x%x, Media control = 0x%x\n",  		   params->multi_phy_config, val); -	if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) { +	if ((phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) || +	    (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834)) {  		bnx2x_84833_pair_swap_cfg(phy, params, vars);  		/* Keep AutogrEEEn disabled. */ @@ -9904,7 +10096,7 @@ static int bnx2x_848x3_config_init(struct bnx2x_phy *phy,  		bnx2x_save_848xx_spirom_version(phy, bp, params->port);  	/* 84833 PHY has a better feature and doesn't need to support this. */  	if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84823) { -		cms_enable = REG_RD(bp, params->shmem_base + +		u32 cms_enable = REG_RD(bp, params->shmem_base +  			offsetof(struct shmem_region,  			dev_info.port_hw_config[params->port].default_cfg)) &  			PORT_HW_CFG_ENABLE_CMS_MASK; @@ -9933,7 +10125,7 @@ static int bnx2x_848x3_config_init(struct bnx2x_phy *phy,  			return rc;  		} -		if ((params->req_duplex[actual_phy_selection] == DUPLEX_FULL) && +		if ((phy->req_duplex == DUPLEX_FULL) &&  		    (params->eee_mode & EEE_MODE_ADV_LPI) &&  		    (bnx2x_eee_calc_timer(params) ||  		     !(params->eee_mode & EEE_MODE_ENABLE_LPI))) @@ -9948,15 +10140,13 @@ static int bnx2x_848x3_config_init(struct bnx2x_phy *phy,  		vars->eee_status &= ~SHMEM_EEE_SUPPORTED_MASK;  	} -	if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) { +	if ((phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) || +	    (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834)) {  		/* Bring PHY out of super isolate mode as the final step. */ -		bnx2x_cl45_read(bp, phy, -				MDIO_CTL_DEVAD, -				MDIO_84833_TOP_CFG_XGPHY_STRAP1, &val); -		val &= ~MDIO_84833_SUPER_ISOLATE; -		bnx2x_cl45_write(bp, phy, -				MDIO_CTL_DEVAD, -				MDIO_84833_TOP_CFG_XGPHY_STRAP1, val); +		bnx2x_cl45_read_and_write(bp, phy, +					  MDIO_CTL_DEVAD, +					  MDIO_84833_TOP_CFG_XGPHY_STRAP1, +					  (u16)~MDIO_84833_SUPER_ISOLATE);  	}  	return rc;  } @@ -10090,7 +10280,6 @@ static u8 bnx2x_848xx_read_status(struct bnx2x_phy *phy,  	return link_up;  } -  static int bnx2x_848xx_format_ver(u32 raw_ver, u8 *str, u16 *len)  {  	int status = 0; @@ -10962,7 +11151,7 @@ static void bnx2x_7101_set_link_led(struct bnx2x_phy *phy,  /*			STATIC PHY DECLARATION			  */  /******************************************************************/ -static struct bnx2x_phy phy_null = { +static const struct bnx2x_phy phy_null = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_NOT_CONN,  	.addr		= 0,  	.def_md_devad	= 0, @@ -10988,7 +11177,7 @@ static struct bnx2x_phy phy_null = {  	.phy_specific_func = (phy_specific_func_t)NULL  }; -static struct bnx2x_phy phy_serdes = { +static const struct bnx2x_phy phy_serdes = {  	.type		= PORT_HW_CFG_SERDES_EXT_PHY_TYPE_DIRECT,  	.addr		= 0xff,  	.def_md_devad	= 0, @@ -11023,7 +11212,7 @@ static struct bnx2x_phy phy_serdes = {  	.phy_specific_func = (phy_specific_func_t)NULL  }; -static struct bnx2x_phy phy_xgxs = { +static const struct bnx2x_phy phy_xgxs = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT,  	.addr		= 0xff,  	.def_md_devad	= 0, @@ -11058,12 +11247,11 @@ static struct bnx2x_phy phy_xgxs = {  	.set_link_led	= (set_link_led_t)NULL,  	.phy_specific_func = (phy_specific_func_t)bnx2x_xgxs_specific_func  }; -static struct bnx2x_phy phy_warpcore = { +static const struct bnx2x_phy phy_warpcore = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT,  	.addr		= 0xff,  	.def_md_devad	= 0, -	.flags		= (FLAGS_HW_LOCK_REQUIRED | -			   FLAGS_TX_ERROR_CHECK), +	.flags		= FLAGS_TX_ERROR_CHECK,  	.rx_preemphasis	= {0xffff, 0xffff, 0xffff, 0xffff},  	.tx_preemphasis	= {0xffff, 0xffff, 0xffff, 0xffff},  	.mdio_ctrl	= 0, @@ -11097,7 +11285,7 @@ static struct bnx2x_phy phy_warpcore = {  }; -static struct bnx2x_phy phy_7101 = { +static const struct bnx2x_phy phy_7101 = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101,  	.addr		= 0xff,  	.def_md_devad	= 0, @@ -11126,11 +11314,11 @@ static struct bnx2x_phy phy_7101 = {  	.set_link_led	= (set_link_led_t)bnx2x_7101_set_link_led,  	.phy_specific_func = (phy_specific_func_t)NULL  }; -static struct bnx2x_phy phy_8073 = { +static const struct bnx2x_phy phy_8073 = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073,  	.addr		= 0xff,  	.def_md_devad	= 0, -	.flags		= FLAGS_HW_LOCK_REQUIRED, +	.flags		= 0,  	.rx_preemphasis	= {0xffff, 0xffff, 0xffff, 0xffff},  	.tx_preemphasis	= {0xffff, 0xffff, 0xffff, 0xffff},  	.mdio_ctrl	= 0, @@ -11157,7 +11345,7 @@ static struct bnx2x_phy phy_8073 = {  	.set_link_led	= (set_link_led_t)NULL,  	.phy_specific_func = (phy_specific_func_t)bnx2x_8073_specific_func  }; -static struct bnx2x_phy phy_8705 = { +static const struct bnx2x_phy phy_8705 = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705,  	.addr		= 0xff,  	.def_md_devad	= 0, @@ -11185,7 +11373,7 @@ static struct bnx2x_phy phy_8705 = {  	.set_link_led	= (set_link_led_t)NULL,  	.phy_specific_func = (phy_specific_func_t)NULL  }; -static struct bnx2x_phy phy_8706 = { +static const struct bnx2x_phy phy_8706 = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706,  	.addr		= 0xff,  	.def_md_devad	= 0, @@ -11215,12 +11403,11 @@ static struct bnx2x_phy phy_8706 = {  	.phy_specific_func = (phy_specific_func_t)NULL  }; -static struct bnx2x_phy phy_8726 = { +static const struct bnx2x_phy phy_8726 = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726,  	.addr		= 0xff,  	.def_md_devad	= 0, -	.flags		= (FLAGS_HW_LOCK_REQUIRED | -			   FLAGS_INIT_XGXS_FIRST | +	.flags		= (FLAGS_INIT_XGXS_FIRST |  			   FLAGS_TX_ERROR_CHECK),  	.rx_preemphasis	= {0xffff, 0xffff, 0xffff, 0xffff},  	.tx_preemphasis	= {0xffff, 0xffff, 0xffff, 0xffff}, @@ -11248,7 +11435,7 @@ static struct bnx2x_phy phy_8726 = {  	.phy_specific_func = (phy_specific_func_t)NULL  }; -static struct bnx2x_phy phy_8727 = { +static const struct bnx2x_phy phy_8727 = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727,  	.addr		= 0xff,  	.def_md_devad	= 0, @@ -11278,7 +11465,7 @@ static struct bnx2x_phy phy_8727 = {  	.set_link_led	= (set_link_led_t)bnx2x_8727_set_link_led,  	.phy_specific_func = (phy_specific_func_t)bnx2x_8727_specific_func  }; -static struct bnx2x_phy phy_8481 = { +static const struct bnx2x_phy phy_8481 = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481,  	.addr		= 0xff,  	.def_md_devad	= 0, @@ -11314,7 +11501,7 @@ static struct bnx2x_phy phy_8481 = {  	.phy_specific_func = (phy_specific_func_t)NULL  }; -static struct bnx2x_phy phy_84823 = { +static const struct bnx2x_phy phy_84823 = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84823,  	.addr		= 0xff,  	.def_md_devad	= 0, @@ -11351,7 +11538,7 @@ static struct bnx2x_phy phy_84823 = {  	.phy_specific_func = (phy_specific_func_t)bnx2x_848xx_specific_func  }; -static struct bnx2x_phy phy_84833 = { +static const struct bnx2x_phy phy_84833 = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833,  	.addr		= 0xff,  	.def_md_devad	= 0, @@ -11386,7 +11573,41 @@ static struct bnx2x_phy phy_84833 = {  	.phy_specific_func = (phy_specific_func_t)bnx2x_848xx_specific_func  }; -static struct bnx2x_phy phy_54618se = { +static const struct bnx2x_phy phy_84834 = { +	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834, +	.addr		= 0xff, +	.def_md_devad	= 0, +	.flags		= FLAGS_FAN_FAILURE_DET_REQ | +			    FLAGS_REARM_LATCH_SIGNAL, +	.rx_preemphasis	= {0xffff, 0xffff, 0xffff, 0xffff}, +	.tx_preemphasis	= {0xffff, 0xffff, 0xffff, 0xffff}, +	.mdio_ctrl	= 0, +	.supported	= (SUPPORTED_100baseT_Half | +			   SUPPORTED_100baseT_Full | +			   SUPPORTED_1000baseT_Full | +			   SUPPORTED_10000baseT_Full | +			   SUPPORTED_TP | +			   SUPPORTED_Autoneg | +			   SUPPORTED_Pause | +			   SUPPORTED_Asym_Pause), +	.media_type	= ETH_PHY_BASE_T, +	.ver_addr	= 0, +	.req_flow_ctrl	= 0, +	.req_line_speed	= 0, +	.speed_cap_mask	= 0, +	.req_duplex	= 0, +	.rsrv		= 0, +	.config_init	= (config_init_t)bnx2x_848x3_config_init, +	.read_status	= (read_status_t)bnx2x_848xx_read_status, +	.link_reset	= (link_reset_t)bnx2x_848x3_link_reset, +	.config_loopback = (config_loopback_t)NULL, +	.format_fw_ver	= (format_fw_ver_t)bnx2x_848xx_format_ver, +	.hw_reset	= (hw_reset_t)bnx2x_84833_hw_reset_phy, +	.set_link_led	= (set_link_led_t)bnx2x_848xx_set_link_led, +	.phy_specific_func = (phy_specific_func_t)bnx2x_848xx_specific_func +}; + +static const struct bnx2x_phy phy_54618se = {  	.type		= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE,  	.addr		= 0xff,  	.def_md_devad	= 0, @@ -11564,9 +11785,11 @@ static int bnx2x_populate_int_phy(struct bnx2x *bp, u32 shmem_base, u8 port,  			phy->media_type = ETH_PHY_KR;  			phy->flags |= FLAGS_WC_DUAL_MODE;  			phy->supported &= (SUPPORTED_20000baseKR2_Full | +					   SUPPORTED_Autoneg |  					   SUPPORTED_FIBRE |  					   SUPPORTED_Pause |  					   SUPPORTED_Asym_Pause); +			phy->flags &= ~FLAGS_TX_ERROR_CHECK;  			break;  		default:  			DP(NETIF_MSG_LINK, "Unknown WC interface type 0x%x\n", @@ -11665,6 +11888,9 @@ static int bnx2x_populate_ext_phy(struct bnx2x *bp,  	case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833:  		*phy = phy_84833;  		break; +	case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834: +		*phy = phy_84834; +		break;  	case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54616:  	case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE:  		*phy = phy_54618se; @@ -11721,9 +11947,10 @@ static int bnx2x_populate_ext_phy(struct bnx2x *bp,  	}  	phy->mdio_ctrl = bnx2x_get_emac_base(bp, mdc_mdio_access, port); -	if ((phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) && +	if (((phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) || +	     (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834)) &&  	    (phy->ver_addr)) { -		/* Remove 100Mb link supported for BCM84833 when phy fw +		/* Remove 100Mb link supported for BCM84833/4 when phy fw  		 * version lower than or equal to 1.39  		 */  		u32 raw_ver = REG_RD(bp, phy->ver_addr); @@ -11733,12 +11960,6 @@ static int bnx2x_populate_ext_phy(struct bnx2x *bp,  					    SUPPORTED_100baseT_Full);  	} -	/* In case mdc/mdio_access of the external phy is different than the -	 * mdc/mdio access of the XGXS, a HW lock must be taken in each access -	 * to prevent one port interfere with another port's CL45 operations. -	 */ -	if (mdc_mdio_access != SHARED_HW_CFG_MDC_MDIO_ACCESS1_BOTH) -		phy->flags |= FLAGS_HW_LOCK_REQUIRED;  	DP(NETIF_MSG_LINK, "phy_type 0x%x port %d found in index %d\n",  		   phy_type, port, phy_index);  	DP(NETIF_MSG_LINK, "             addr=0x%x, mdio_ctl=0x%x\n", @@ -11863,7 +12084,6 @@ u32 bnx2x_phy_selection(struct link_params *params)  	return return_cfg;  } -  int bnx2x_phy_probe(struct link_params *params)  {  	u8 phy_index, actual_phy_idx; @@ -11907,6 +12127,10 @@ int bnx2x_phy_probe(struct link_params *params)  		    FEATURE_CONFIG_DISABLE_REMOTE_FAULT_DET)  			phy->flags &= ~FLAGS_TX_ERROR_CHECK; +		if (!(params->feature_config_flags & +		      FEATURE_CONFIG_MT_SUPPORT)) +			phy->flags |= FLAGS_MDC_MDIO_WA_G; +  		sync_offset = params->shmem_base +  			offsetof(struct shmem_region,  			dev_info.port_hw_config[params->port].media_type); @@ -11934,8 +12158,8 @@ int bnx2x_phy_probe(struct link_params *params)  	return 0;  } -void bnx2x_init_bmac_loopback(struct link_params *params, -			      struct link_vars *vars) +static void bnx2x_init_bmac_loopback(struct link_params *params, +				     struct link_vars *vars)  {  	struct bnx2x *bp = params->bp;  		vars->link_up = 1; @@ -11954,8 +12178,8 @@ void bnx2x_init_bmac_loopback(struct link_params *params,  		REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);  } -void bnx2x_init_emac_loopback(struct link_params *params, -			      struct link_vars *vars) +static void bnx2x_init_emac_loopback(struct link_params *params, +				     struct link_vars *vars)  {  	struct bnx2x *bp = params->bp;  		vars->link_up = 1; @@ -11973,8 +12197,8 @@ void bnx2x_init_emac_loopback(struct link_params *params,  		REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);  } -void bnx2x_init_xmac_loopback(struct link_params *params, -			      struct link_vars *vars) +static void bnx2x_init_xmac_loopback(struct link_params *params, +				     struct link_vars *vars)  {  	struct bnx2x *bp = params->bp;  	vars->link_up = 1; @@ -11999,8 +12223,8 @@ void bnx2x_init_xmac_loopback(struct link_params *params,  	REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);  } -void bnx2x_init_umac_loopback(struct link_params *params, -			      struct link_vars *vars) +static void bnx2x_init_umac_loopback(struct link_params *params, +				     struct link_vars *vars)  {  	struct bnx2x *bp = params->bp;  	vars->link_up = 1; @@ -12014,17 +12238,21 @@ void bnx2x_init_umac_loopback(struct link_params *params,  	REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);  } -void bnx2x_init_xgxs_loopback(struct link_params *params, -			      struct link_vars *vars) +static void bnx2x_init_xgxs_loopback(struct link_params *params, +				     struct link_vars *vars)  {  	struct bnx2x *bp = params->bp; -		vars->link_up = 1; -		vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE; -		vars->duplex = DUPLEX_FULL; +	struct bnx2x_phy *int_phy = ¶ms->phy[INT_PHY]; +	vars->link_up = 1; +	vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE; +	vars->duplex = DUPLEX_FULL;  	if (params->req_line_speed[0] == SPEED_1000) -			vars->line_speed = SPEED_1000; +		vars->line_speed = SPEED_1000; +	else if ((params->req_line_speed[0] == SPEED_20000) || +		 (int_phy->flags & FLAGS_WC_DUAL_MODE)) +		vars->line_speed = SPEED_20000;  	else -			vars->line_speed = SPEED_10000; +		vars->line_speed = SPEED_10000;  	if (!USES_WARPCORE(bp))  		bnx2x_xgxs_deassert(params); @@ -12044,34 +12272,30 @@ void bnx2x_init_xgxs_loopback(struct link_params *params,  			bnx2x_bmac_enable(params, vars, 0, 1);  	} -		if (params->loopback_mode == LOOPBACK_XGXS) { -			/* set 10G XGXS loopback */ -			params->phy[INT_PHY].config_loopback( -				¶ms->phy[INT_PHY], -				params); - -		} else { -			/* set external phy loopback */ -			u8 phy_index; -			for (phy_index = EXT_PHY1; -			      phy_index < params->num_phys; phy_index++) { -				if (params->phy[phy_index].config_loopback) -					params->phy[phy_index].config_loopback( -						¶ms->phy[phy_index], -						params); -			} -		} -		REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); +	if (params->loopback_mode == LOOPBACK_XGXS) { +		/* Set 10G XGXS loopback */ +		int_phy->config_loopback(int_phy, params); +	} else { +		/* Set external phy loopback */ +		u8 phy_index; +		for (phy_index = EXT_PHY1; +		      phy_index < params->num_phys; phy_index++) +			if (params->phy[phy_index].config_loopback) +				params->phy[phy_index].config_loopback( +					¶ms->phy[phy_index], +					params); +	} +	REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);  	bnx2x_set_led(params, vars, LED_MODE_OPER, vars->line_speed);  } -static void bnx2x_set_rx_filter(struct link_params *params, u8 en) +void bnx2x_set_rx_filter(struct link_params *params, u8 en)  {  	struct bnx2x *bp = params->bp;  	u8 val = en * 0x1F; -	/* Open the gate between the NIG to the BRB */ +	/* Open / close the gate between the NIG and the BRB */  	if (!CHIP_IS_E1x(bp))  		val |= en * 0x20;  	REG_WR(bp, NIG_REG_LLH0_BRB1_DRV_MASK + params->port*4, val); @@ -12345,7 +12569,7 @@ int bnx2x_link_reset(struct link_params *params, struct link_vars *vars,  	 * Hold it as vars low  	 */  	 /* Clear link led */ -	bnx2x_set_mdio_clk(bp, params->chip_id, port); +	bnx2x_set_mdio_emac_per_phy(bp, params);  	bnx2x_set_led(params, vars, LED_MODE_OFF, 0);  	if (reset_ext_phy) { @@ -12696,7 +12920,7 @@ static int bnx2x_8727_common_init_phy(struct bnx2x *bp,  	/* Initiate PHY reset*/  	bnx2x_set_gpio(bp, reset_gpio, MISC_REGISTERS_GPIO_OUTPUT_LOW,  		       port); -	 usleep_range(1000, 2000); +	usleep_range(1000, 2000);  	bnx2x_set_gpio(bp, reset_gpio, MISC_REGISTERS_GPIO_OUTPUT_HIGH,  		       port); @@ -12784,7 +13008,8 @@ static int bnx2x_84833_common_init_phy(struct bnx2x *bp,  }  static int bnx2x_84833_pre_init_phy(struct bnx2x *bp, -					       struct bnx2x_phy *phy) +				    struct bnx2x_phy *phy, +				    u8 port)  {  	u16 val, cnt;  	/* Wait for FW completing its initialization. */ @@ -12794,7 +13019,7 @@ static int bnx2x_84833_pre_init_phy(struct bnx2x *bp,  				MDIO_PMA_REG_CTRL, &val);  		if (!(val & (1<<15)))  			break; -		 usleep_range(1000, 2000); +		usleep_range(1000, 2000);  	}  	if (cnt >= 1500) {  		DP(NETIF_MSG_LINK, "84833 reset timeout\n"); @@ -12811,26 +13036,28 @@ static int bnx2x_84833_pre_init_phy(struct bnx2x *bp,  			 MDIO_84833_TOP_CFG_XGPHY_STRAP1, val);  	/* Save spirom version */ -	bnx2x_save_848xx_spirom_version(phy, bp, PORT_0); +	bnx2x_save_848xx_spirom_version(phy, bp, port);  	return 0;  }  int bnx2x_pre_init_phy(struct bnx2x *bp,  				  u32 shmem_base,  				  u32 shmem2_base, -				  u32 chip_id) +				  u32 chip_id, +				  u8 port)  {  	int rc = 0;  	struct bnx2x_phy phy; -	bnx2x_set_mdio_clk(bp, chip_id, PORT_0);  	if (bnx2x_populate_phy(bp, EXT_PHY1, shmem_base, shmem2_base, -			       PORT_0, &phy)) { +			       port, &phy) != 0) {  		DP(NETIF_MSG_LINK, "populate_phy failed\n");  		return -EINVAL;  	} +	bnx2x_set_mdio_clk(bp, chip_id, phy.mdio_ctrl);  	switch (phy.type) {  	case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833: -		rc = bnx2x_84833_pre_init_phy(bp, &phy); +	case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834: +		rc = bnx2x_84833_pre_init_phy(bp, &phy, port);  		break;  	default:  		break; @@ -12867,6 +13094,7 @@ static int bnx2x_ext_phy_common_init(struct bnx2x *bp, u32 shmem_base_path[],  						phy_index, chip_id);  		break;  	case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833: +	case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834:  		/* GPIO3's are linked, and so both need to be toggled  		 * to obtain required 2us pulse.  		 */ @@ -12898,8 +13126,9 @@ int bnx2x_common_init_phy(struct bnx2x *bp, u32 shmem_base_path[],  	u32 phy_ver, val;  	u8 phy_index = 0;  	u32 ext_phy_type, ext_phy_config; -	bnx2x_set_mdio_clk(bp, chip_id, PORT_0); -	bnx2x_set_mdio_clk(bp, chip_id, PORT_1); + +	bnx2x_set_mdio_clk(bp, chip_id, GRCBASE_EMAC0); +	bnx2x_set_mdio_clk(bp, chip_id, GRCBASE_EMAC1);  	DP(NETIF_MSG_LINK, "Begin common phy init\n");  	if (CHIP_IS_E3(bp)) {  		/* Enable EPIO */ @@ -12960,6 +13189,7 @@ static void bnx2x_check_over_curr(struct link_params *params,  					    " error.\n",  			 params->port);  			vars->phy_flags |= PHY_OVER_CURRENT_FLAG; +			bnx2x_warpcore_power_module(params, 0);  		}  	} else  		vars->phy_flags &= ~PHY_OVER_CURRENT_FLAG; @@ -13139,6 +13369,108 @@ static void bnx2x_sfp_tx_fault_detection(struct bnx2x_phy *phy,  		}  	}  } +static void bnx2x_disable_kr2(struct link_params *params, +			      struct link_vars *vars, +			      struct bnx2x_phy *phy) +{ +	struct bnx2x *bp = params->bp; +	int i; +	static struct bnx2x_reg_set reg_set[] = { +		/* Step 1 - Program the TX/RX alignment markers */ +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL82_USERB1_TX_CTRL5, 0x7690}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL82_USERB1_TX_CTRL7, 0xe647}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL82_USERB1_TX_CTRL6, 0xc4f0}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL82_USERB1_TX_CTRL9, 0x7690}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL82_USERB1_RX_CTRL11, 0xe647}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL82_USERB1_RX_CTRL10, 0xc4f0}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL73_USERB0_CTRL, 0x000c}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL73_BAM_CTRL1, 0x6000}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL73_BAM_CTRL3, 0x0000}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_CL73_BAM_CODE_FIELD, 0x0002}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_ETA_CL73_OUI1, 0x0000}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_ETA_CL73_OUI2, 0x0af7}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_ETA_CL73_OUI3, 0x0af7}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_ETA_CL73_LD_BAM_CODE, 0x0002}, +		{MDIO_WC_DEVAD, MDIO_WC_REG_ETA_CL73_LD_UD_CODE, 0x0000} +	}; +	DP(NETIF_MSG_LINK, "Disabling 20G-KR2\n"); + +	for (i = 0; i < sizeof(reg_set)/sizeof(struct bnx2x_reg_set); i++) +		bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg, +				 reg_set[i].val); +	vars->link_attr_sync &= ~LINK_ATTR_SYNC_KR2_ENABLE; +	bnx2x_update_link_attr(params, vars->link_attr_sync); + +	/* Restart AN on leading lane */ +	bnx2x_warpcore_restart_AN_KR(phy, params); +} + +static void bnx2x_kr2_recovery(struct link_params *params, +			       struct link_vars *vars, +			       struct bnx2x_phy *phy) +{ +	struct bnx2x *bp = params->bp; +	DP(NETIF_MSG_LINK, "KR2 recovery\n"); +	bnx2x_warpcore_enable_AN_KR2(phy, params, vars); +	bnx2x_warpcore_restart_AN_KR(phy, params); +} + +static void bnx2x_check_kr2_wa(struct link_params *params, +			       struct link_vars *vars, +			       struct bnx2x_phy *phy) +{ +	struct bnx2x *bp = params->bp; +	u16 base_page, next_page, not_kr2_device, lane; +	int sigdet = bnx2x_warpcore_get_sigdet(phy, params); + +	if (!sigdet) { +		if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) +			bnx2x_kr2_recovery(params, vars, phy); +		return; +	} + +	lane = bnx2x_get_warpcore_lane(phy, params); +	CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, +			  MDIO_AER_BLOCK_AER_REG, lane); +	bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, +			MDIO_AN_REG_LP_AUTO_NEG, &base_page); +	bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, +			MDIO_AN_REG_LP_AUTO_NEG2, &next_page); +	bnx2x_set_aer_mmd(params, phy); + +	/* CL73 has not begun yet */ +	if (base_page == 0) { +		if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) +			bnx2x_kr2_recovery(params, vars, phy); +		return; +	} + +	/* In case NP bit is not set in the BasePage, or it is set, +	 * but only KX is advertised, declare this link partner as non-KR2 +	 * device. +	 */ +	not_kr2_device = (((base_page & 0x8000) == 0) || +			  (((base_page & 0x8000) && +			    ((next_page & 0xe0) == 0x2)))); + +	/* In case KR2 is already disabled, check if we need to re-enable it */ +	if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) { +		if (!not_kr2_device) { +			DP(NETIF_MSG_LINK, "BP=0x%x, NP=0x%x\n", base_page, +				       next_page); +			bnx2x_kr2_recovery(params, vars, phy); +		} +		return; +	} +	/* KR2 is enabled, but not KR2 device */ +	if (not_kr2_device) { +		/* Disable KR2 on both lanes */ +		DP(NETIF_MSG_LINK, "BP=0x%x, NP=0x%x\n", base_page, next_page); +		bnx2x_disable_kr2(params, vars, phy); +		return; +	} +} +  void bnx2x_period_func(struct link_params *params, struct link_vars *vars)  {  	u16 phy_idx; @@ -13156,6 +13488,9 @@ void bnx2x_period_func(struct link_params *params, struct link_vars *vars)  	if (CHIP_IS_E3(bp)) {  		struct bnx2x_phy *phy = ¶ms->phy[INT_PHY];  		bnx2x_set_aer_mmd(params, phy); +		if ((phy->supported & SUPPORTED_20000baseKR2_Full) && +		    (phy->speed_cap_mask & SPEED_20000)) +			bnx2x_check_kr2_wa(params, vars, phy);  		bnx2x_check_over_curr(params, vars);  		if (vars->rx_tx_asic_rst)  			bnx2x_warpcore_config_runtime(phy, params, vars); @@ -13176,27 +13511,7 @@ void bnx2x_period_func(struct link_params *params, struct link_vars *vars)  				bnx2x_update_mng(params, vars->link_status);  			}  		} - -	} - -} - -u8 bnx2x_hw_lock_required(struct bnx2x *bp, u32 shmem_base, u32 shmem2_base) -{ -	u8 phy_index; -	struct bnx2x_phy phy; -	for (phy_index = INT_PHY; phy_index < MAX_PHYS; -	      phy_index++) { -		if (bnx2x_populate_phy(bp, phy_index, shmem_base, shmem2_base, -				       0, &phy) != 0) { -			DP(NETIF_MSG_LINK, "populate phy failed\n"); -			return 0; -		} - -		if (phy.flags & FLAGS_HW_LOCK_REQUIRED) -			return 1;  	} -	return 0;  }  u8 bnx2x_fan_failure_det_req(struct bnx2x *bp, diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h index 9165b89a4b19..ee6e7ec85457 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h @@ -139,8 +139,6 @@ struct bnx2x_phy {  	u8 addr;  	u8 def_md_devad;  	u16 flags; -	/* Require HW lock */ -#define FLAGS_HW_LOCK_REQUIRED		(1<<0)  	/* No Over-Current detection */  #define FLAGS_NOC			(1<<1)  	/* Fan failure detection required */ @@ -156,6 +154,7 @@ struct bnx2x_phy {  #define FLAGS_MDC_MDIO_WA_B0		(1<<10)  #define FLAGS_TX_ERROR_CHECK		(1<<12)  #define FLAGS_EEE			(1<<13) +#define FLAGS_MDC_MDIO_WA_G		(1<<15)  	/* preemphasis values for the rx side */  	u16 rx_preemphasis[4]; @@ -267,6 +266,9 @@ struct link_params {  #define FEATURE_CONFIG_AUTOGREEEN_ENABLED			(1<<9)  #define FEATURE_CONFIG_BC_SUPPORTS_SFP_TX_DISABLED		(1<<10)  #define FEATURE_CONFIG_DISABLE_REMOTE_FAULT_DET		(1<<11) +#define FEATURE_CONFIG_MT_SUPPORT			(1<<13) +#define FEATURE_CONFIG_BOOT_FROM_SAN			(1<<14) +  	/* Will be populated during common init */  	struct bnx2x_phy phy[MAX_PHYS]; @@ -347,6 +349,8 @@ struct link_vars {  	u8 rx_tx_asic_rst;  	u8 turn_to_run_wc_rt;  	u16 rsrv2; +	/* The same definitions as the shmem2 parameter */ +	u32 link_attr_sync;  };  /***********************************************************/ @@ -418,10 +422,6 @@ int bnx2x_read_sfp_module_eeprom(struct bnx2x_phy *phy,  void bnx2x_hw_reset_phy(struct link_params *params); -/* Checks if HW lock is required for this phy/board type */ -u8 bnx2x_hw_lock_required(struct bnx2x *bp, u32 shmem_base, -			  u32 shmem2_base); -  /* Check swap bit and adjust PHY order */  u32 bnx2x_phy_selection(struct link_params *params); @@ -432,7 +432,8 @@ int bnx2x_phy_probe(struct link_params *params);  u8 bnx2x_fan_failure_det_req(struct bnx2x *bp, u32 shmem_base,  			     u32 shmem2_base, u8 port); - +/* Open / close the gate between the NIG and the BRB */ +void bnx2x_set_rx_filter(struct link_params *params, u8 en);  /* DCBX structs */ @@ -459,9 +460,6 @@ struct bnx2x_nig_brb_pfc_port_params {  	u32 rx_cos_priority_mask[DCBX_MAX_NUM_COS];  	u32 llfc_high_priority_classes;  	u32 llfc_low_priority_classes; -	/* BRB */ -	u32 cos0_pauseable; -	u32 cos1_pauseable;  }; diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 01611b33a93d..940ef859dc60 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c @@ -79,7 +79,7 @@  /* Time in jiffies before concluding the transmitter is hung */  #define TX_TIMEOUT		(5*HZ) -static char version[] __devinitdata = +static char version[] =  	"Broadcom NetXtreme II 5771x/578xx 10/20-Gigabit Ethernet Driver "  	DRV_MODULE_NAME " " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; @@ -149,7 +149,7 @@ enum bnx2x_board_type {  /* indexed by board_type, above */  static struct {  	char *name; -} board_info[] __devinitdata = { +} board_info[] = {  	{ "Broadcom NetXtreme II BCM57710 10 Gigabit PCIe [Everest]" },  	{ "Broadcom NetXtreme II BCM57711 10 Gigabit PCIe" },  	{ "Broadcom NetXtreme II BCM57711E 10 Gigabit PCIe" }, @@ -791,10 +791,9 @@ void bnx2x_panic_dump(struct bnx2x *bp)  		/* host sb data */ -#ifdef BCM_CNIC  		if (IS_FCOE_FP(fp))  			continue; -#endif +  		BNX2X_ERR("     run indexes (");  		for (j = 0; j < HC_SB_MAX_SM; j++)  			pr_cont("0x%x%s", @@ -859,7 +858,7 @@ void bnx2x_panic_dump(struct bnx2x *bp)  #ifdef BNX2X_STOP_ON_ERROR  	/* Rings */  	/* Rx */ -	for_each_rx_queue(bp, i) { +	for_each_valid_rx_queue(bp, i) {  		struct bnx2x_fastpath *fp = &bp->fp[i];  		start = RX_BD(le16_to_cpu(*fp->rx_cons_sb) - 10); @@ -893,7 +892,7 @@ void bnx2x_panic_dump(struct bnx2x *bp)  	}  	/* Tx */ -	for_each_tx_queue(bp, i) { +	for_each_valid_tx_queue(bp, i) {  		struct bnx2x_fastpath *fp = &bp->fp[i];  		for_each_cos_in_tx_queue(fp, cos) {  			struct bnx2x_fp_txdata *txdata = fp->txdata_ptr[cos]; @@ -1483,7 +1482,7 @@ static void bnx2x_igu_int_disable(struct bnx2x *bp)  		BNX2X_ERR("BUG! proper val not read from IGU!\n");  } -void bnx2x_int_disable(struct bnx2x *bp) +static void bnx2x_int_disable(struct bnx2x *bp)  {  	if (bp->common.int_block == INT_BLOCK_HC)  		bnx2x_hc_int_disable(bp); @@ -1504,9 +1503,8 @@ void bnx2x_int_disable_sync(struct bnx2x *bp, int disable_hw)  	if (msix) {  		synchronize_irq(bp->msix_table[0].vector);  		offset = 1; -#ifdef BCM_CNIC -		offset++; -#endif +		if (CNIC_SUPPORT(bp)) +			offset++;  		for_each_eth_queue(bp, i)  			synchronize_irq(bp->msix_table[offset++].vector);  	} else @@ -1588,9 +1586,8 @@ static bool bnx2x_trylock_leader_lock(struct bnx2x *bp)  	return bnx2x_trylock_hw_lock(bp, bnx2x_get_leader_lock_resource(bp));  } -#ifdef BCM_CNIC  static void bnx2x_cnic_cfc_comp(struct bnx2x *bp, int cid, u8 err); -#endif +  void bnx2x_sp_event(struct bnx2x_fastpath *fp, union eth_rx_cqe *rr_cqe)  { @@ -1720,7 +1717,7 @@ irqreturn_t bnx2x_interrupt(int irq, void *dev_instance)  	for_each_eth_queue(bp, i) {  		struct bnx2x_fastpath *fp = &bp->fp[i]; -		mask = 0x2 << (fp->index + CNIC_PRESENT); +		mask = 0x2 << (fp->index + CNIC_SUPPORT(bp));  		if (status & mask) {  			/* Handle Rx or Tx according to SB id */  			prefetch(fp->rx_cons_sb); @@ -1732,22 +1729,23 @@ irqreturn_t bnx2x_interrupt(int irq, void *dev_instance)  		}  	} -#ifdef BCM_CNIC -	mask = 0x2; -	if (status & (mask | 0x1)) { -		struct cnic_ops *c_ops = NULL; +	if (CNIC_SUPPORT(bp)) { +		mask = 0x2; +		if (status & (mask | 0x1)) { +			struct cnic_ops *c_ops = NULL; -		if (likely(bp->state == BNX2X_STATE_OPEN)) { -			rcu_read_lock(); -			c_ops = rcu_dereference(bp->cnic_ops); -			if (c_ops) -				c_ops->cnic_handler(bp->cnic_data, NULL); -			rcu_read_unlock(); -		} +			if (likely(bp->state == BNX2X_STATE_OPEN)) { +				rcu_read_lock(); +				c_ops = rcu_dereference(bp->cnic_ops); +				if (c_ops) +					c_ops->cnic_handler(bp->cnic_data, +							    NULL); +				rcu_read_unlock(); +			} -		status &= ~mask; +			status &= ~mask; +		}  	} -#endif  	if (unlikely(status & 0x1)) {  		queue_delayed_work(bnx2x_wq, &bp->sp_task, 0); @@ -2034,40 +2032,39 @@ int bnx2x_set_gpio_int(struct bnx2x *bp, int gpio_num, u32 mode, u8 port)  	return 0;  } -static int bnx2x_set_spio(struct bnx2x *bp, int spio_num, u32 mode) +static int bnx2x_set_spio(struct bnx2x *bp, int spio, u32 mode)  { -	u32 spio_mask = (1 << spio_num);  	u32 spio_reg; -	if ((spio_num < MISC_REGISTERS_SPIO_4) || -	    (spio_num > MISC_REGISTERS_SPIO_7)) { -		BNX2X_ERR("Invalid SPIO %d\n", spio_num); +	/* Only 2 SPIOs are configurable */ +	if ((spio != MISC_SPIO_SPIO4) && (spio != MISC_SPIO_SPIO5)) { +		BNX2X_ERR("Invalid SPIO 0x%x\n", spio);  		return -EINVAL;  	}  	bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_SPIO);  	/* read SPIO and mask except the float bits */ -	spio_reg = (REG_RD(bp, MISC_REG_SPIO) & MISC_REGISTERS_SPIO_FLOAT); +	spio_reg = (REG_RD(bp, MISC_REG_SPIO) & MISC_SPIO_FLOAT);  	switch (mode) { -	case MISC_REGISTERS_SPIO_OUTPUT_LOW: -		DP(NETIF_MSG_HW, "Set SPIO %d -> output low\n", spio_num); +	case MISC_SPIO_OUTPUT_LOW: +		DP(NETIF_MSG_HW, "Set SPIO 0x%x -> output low\n", spio);  		/* clear FLOAT and set CLR */ -		spio_reg &= ~(spio_mask << MISC_REGISTERS_SPIO_FLOAT_POS); -		spio_reg |=  (spio_mask << MISC_REGISTERS_SPIO_CLR_POS); +		spio_reg &= ~(spio << MISC_SPIO_FLOAT_POS); +		spio_reg |=  (spio << MISC_SPIO_CLR_POS);  		break; -	case MISC_REGISTERS_SPIO_OUTPUT_HIGH: -		DP(NETIF_MSG_HW, "Set SPIO %d -> output high\n", spio_num); +	case MISC_SPIO_OUTPUT_HIGH: +		DP(NETIF_MSG_HW, "Set SPIO 0x%x -> output high\n", spio);  		/* clear FLOAT and set SET */ -		spio_reg &= ~(spio_mask << MISC_REGISTERS_SPIO_FLOAT_POS); -		spio_reg |=  (spio_mask << MISC_REGISTERS_SPIO_SET_POS); +		spio_reg &= ~(spio << MISC_SPIO_FLOAT_POS); +		spio_reg |=  (spio << MISC_SPIO_SET_POS);  		break; -	case MISC_REGISTERS_SPIO_INPUT_HI_Z: -		DP(NETIF_MSG_HW, "Set SPIO %d -> input\n", spio_num); +	case MISC_SPIO_INPUT_HI_Z: +		DP(NETIF_MSG_HW, "Set SPIO 0x%x -> input\n", spio);  		/* set FLOAT */ -		spio_reg |= (spio_mask << MISC_REGISTERS_SPIO_FLOAT_POS); +		spio_reg |= (spio << MISC_SPIO_FLOAT_POS);  		break;  	default: @@ -2106,22 +2103,25 @@ void bnx2x_calc_fc_adv(struct bnx2x *bp)  	}  } -u8 bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode) +static void bnx2x_set_requested_fc(struct bnx2x *bp)  { -	if (!BP_NOMCP(bp)) { -		u8 rc; -		int cfx_idx = bnx2x_get_link_cfg_idx(bp); -		u16 req_line_speed = bp->link_params.req_line_speed[cfx_idx]; -		/* -		 * Initialize link parameters structure variables -		 * It is recommended to turn off RX FC for jumbo frames -		 * for better performance -		 */ -		if (CHIP_IS_E1x(bp) && (bp->dev->mtu > 5000)) -			bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_TX; -		else -			bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_BOTH; +	/* Initialize link parameters structure variables +	 * It is recommended to turn off RX FC for jumbo frames +	 *  for better performance +	 */ +	if (CHIP_IS_E1x(bp) && (bp->dev->mtu > 5000)) +		bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_TX; +	else +		bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_BOTH; +} +int bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode) +{ +	int rc, cfx_idx = bnx2x_get_link_cfg_idx(bp); +	u16 req_line_speed = bp->link_params.req_line_speed[cfx_idx]; + +	if (!BP_NOMCP(bp)) { +		bnx2x_set_requested_fc(bp);  		bnx2x_acquire_phy_lock(bp);  		if (load_mode == LOAD_DIAG) { @@ -2150,11 +2150,11 @@ u8 bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode)  		bnx2x_calc_fc_adv(bp); -		if (CHIP_REV_IS_SLOW(bp) && bp->link_vars.link_up) { +		if (bp->link_vars.link_up) {  			bnx2x_stats_handle(bp, STATS_EVENT_LINK_UP);  			bnx2x_link_report(bp); -		} else -			queue_delayed_work(bnx2x_wq, &bp->period_task, 0); +		} +		queue_delayed_work(bnx2x_wq, &bp->period_task, 0);  		bp->link_params.req_line_speed[cfx_idx] = req_line_speed;  		return rc;  	} @@ -3075,11 +3075,13 @@ static void bnx2x_drv_info_ether_stat(struct bnx2x *bp)  static void bnx2x_drv_info_fcoe_stat(struct bnx2x *bp)  { -#ifdef BCM_CNIC  	struct bnx2x_dcbx_app_params *app = &bp->dcbx_port_params.app;  	struct fcoe_stats_info *fcoe_stat =  		&bp->slowpath->drv_info_to_mcp.fcoe_stat; +	if (!CNIC_LOADED(bp)) +		return; +  	memcpy(fcoe_stat->mac_local + MAC_LEADING_ZERO_CNT,  	       bp->fip_mac, ETH_ALEN); @@ -3162,16 +3164,17 @@ static void bnx2x_drv_info_fcoe_stat(struct bnx2x *bp)  	/* ask L5 driver to add data to the struct */  	bnx2x_cnic_notify(bp, CNIC_CTL_FCOE_STATS_GET_CMD); -#endif  }  static void bnx2x_drv_info_iscsi_stat(struct bnx2x *bp)  { -#ifdef BCM_CNIC  	struct bnx2x_dcbx_app_params *app = &bp->dcbx_port_params.app;  	struct iscsi_stats_info *iscsi_stat =  		&bp->slowpath->drv_info_to_mcp.iscsi_stat; +	if (!CNIC_LOADED(bp)) +		return; +  	memcpy(iscsi_stat->mac_local + MAC_LEADING_ZERO_CNT,  	       bp->cnic_eth_dev.iscsi_mac, ETH_ALEN); @@ -3180,7 +3183,6 @@ static void bnx2x_drv_info_iscsi_stat(struct bnx2x *bp)  	/* ask L5 driver to add data to the struct */  	bnx2x_cnic_notify(bp, CNIC_CTL_ISCSI_STATS_GET_CMD); -#endif  }  /* called due to MCP event (on pmf): @@ -3589,6 +3591,21 @@ static void bnx2x_attn_int_asserted(struct bnx2x *bp, u32 asserted)  	/* now set back the mask */  	if (asserted & ATTN_NIG_FOR_FUNC) { +		/* Verify that IGU ack through BAR was written before restoring +		 * NIG mask. This loop should exit after 2-3 iterations max. +		 */ +		if (bp->common.int_block != INT_BLOCK_HC) { +			u32 cnt = 0, igu_acked; +			do { +				igu_acked = REG_RD(bp, +						   IGU_REG_ATTENTION_ACK_BITS); +			} while (((igu_acked & ATTN_NIG_FOR_FUNC) == 0) && +				 (++cnt < MAX_IGU_ATTN_ACK_TO)); +			if (!igu_acked) +				DP(NETIF_MSG_HW, +				   "Failed to verify IGU ack on time\n"); +			barrier(); +		}  		REG_WR(bp, nig_int_mask_addr, nig_mask);  		bnx2x_release_phy_lock(bp);  	} @@ -4572,7 +4589,6 @@ static void bnx2x_update_eq_prod(struct bnx2x *bp, u16 prod)  	mmiowb(); /* keep prod updates ordered */  } -#ifdef BCM_CNIC  static int  bnx2x_cnic_handle_cfc_del(struct bnx2x *bp, u32 cid,  				      union event_ring_elem *elem)  { @@ -4594,7 +4610,6 @@ static int  bnx2x_cnic_handle_cfc_del(struct bnx2x *bp, u32 cid,  	bnx2x_cnic_cfc_comp(bp, cid, err);  	return 0;  } -#endif  static void bnx2x_handle_mcast_eqe(struct bnx2x *bp)  { @@ -4635,11 +4650,9 @@ static void bnx2x_handle_classification_eqe(struct bnx2x *bp,  	switch (elem->message.data.eth_event.echo >> BNX2X_SWCID_SHIFT) {  	case BNX2X_FILTER_MAC_PENDING:  		DP(BNX2X_MSG_SP, "Got SETUP_MAC completions\n"); -#ifdef BCM_CNIC -		if (cid == BNX2X_ISCSI_ETH_CID(bp)) +		if (CNIC_LOADED(bp) && (cid == BNX2X_ISCSI_ETH_CID(bp)))  			vlan_mac_obj = &bp->iscsi_l2_mac_obj;  		else -#endif  			vlan_mac_obj = &bp->sp_objs[cid].mac_obj;  		break; @@ -4665,9 +4678,7 @@ static void bnx2x_handle_classification_eqe(struct bnx2x *bp,  } -#ifdef BCM_CNIC  static void bnx2x_set_iscsi_eth_rx_mode(struct bnx2x *bp, bool start); -#endif  static void bnx2x_handle_rx_mode_eqe(struct bnx2x *bp)  { @@ -4678,14 +4689,12 @@ static void bnx2x_handle_rx_mode_eqe(struct bnx2x *bp)  	/* Send rx_mode command again if was requested */  	if (test_and_clear_bit(BNX2X_FILTER_RX_MODE_SCHED, &bp->sp_state))  		bnx2x_set_storm_rx_mode(bp); -#ifdef BCM_CNIC  	else if (test_and_clear_bit(BNX2X_FILTER_ISCSI_ETH_START_SCHED,  				    &bp->sp_state))  		bnx2x_set_iscsi_eth_rx_mode(bp, true);  	else if (test_and_clear_bit(BNX2X_FILTER_ISCSI_ETH_STOP_SCHED,  				    &bp->sp_state))  		bnx2x_set_iscsi_eth_rx_mode(bp, false); -#endif  	netif_addr_unlock_bh(bp->dev);  } @@ -4747,7 +4756,6 @@ static void bnx2x_after_function_update(struct bnx2x *bp)  				  q);  	} -#ifdef BCM_CNIC  	if (!NO_FCOE(bp)) {  		fp = &bp->fp[FCOE_IDX(bp)];  		queue_params.q_obj = &bnx2x_sp_obj(bp, fp).q_obj; @@ -4770,22 +4778,16 @@ static void bnx2x_after_function_update(struct bnx2x *bp)  		bnx2x_link_report(bp);  		bnx2x_fw_command(bp, DRV_MSG_CODE_AFEX_VIFSET_ACK, 0);  	} -#else -	/* If no FCoE ring - ACK MCP now */ -	bnx2x_link_report(bp); -	bnx2x_fw_command(bp, DRV_MSG_CODE_AFEX_VIFSET_ACK, 0); -#endif /* BCM_CNIC */  }  static struct bnx2x_queue_sp_obj *bnx2x_cid_to_q_obj(  	struct bnx2x *bp, u32 cid)  {  	DP(BNX2X_MSG_SP, "retrieving fp from cid %d\n", cid); -#ifdef BCM_CNIC -	if (cid == BNX2X_FCOE_ETH_CID(bp)) + +	if (CNIC_LOADED(bp) && (cid == BNX2X_FCOE_ETH_CID(bp)))  		return &bnx2x_fcoe_sp_obj(bp, q_obj);  	else -#endif  		return &bp->sp_objs[CID_TO_FP(cid, bp)].q_obj;  } @@ -4793,6 +4795,7 @@ static void bnx2x_eq_int(struct bnx2x *bp)  {  	u16 hw_cons, sw_cons, sw_prod;  	union event_ring_elem *elem; +	u8 echo;  	u32 cid;  	u8 opcode;  	int spqe_cnt = 0; @@ -4847,10 +4850,11 @@ static void bnx2x_eq_int(struct bnx2x *bp)  			 */  			DP(BNX2X_MSG_SP,  			   "got delete ramrod for MULTI[%d]\n", cid); -#ifdef BCM_CNIC -			if (!bnx2x_cnic_handle_cfc_del(bp, cid, elem)) + +			if (CNIC_LOADED(bp) && +			    !bnx2x_cnic_handle_cfc_del(bp, cid, elem))  				goto next_spqe; -#endif +  			q_obj = bnx2x_cid_to_q_obj(bp, cid);  			if (q_obj->complete_cmd(bp, q_obj, BNX2X_Q_CMD_CFC_DEL)) @@ -4875,21 +4879,34 @@ static void bnx2x_eq_int(struct bnx2x *bp)  				break;  			bnx2x_dcbx_set_params(bp, BNX2X_DCBX_STATE_TX_RELEASED);  			goto next_spqe; +  		case EVENT_RING_OPCODE_FUNCTION_UPDATE: -			DP(BNX2X_MSG_SP | BNX2X_MSG_MCP, -			   "AFEX: ramrod completed FUNCTION_UPDATE\n"); -			f_obj->complete_cmd(bp, f_obj, BNX2X_F_CMD_AFEX_UPDATE); +			echo = elem->message.data.function_update_event.echo; +			if (echo == SWITCH_UPDATE) { +				DP(BNX2X_MSG_SP | NETIF_MSG_IFUP, +				   "got FUNC_SWITCH_UPDATE ramrod\n"); +				if (f_obj->complete_cmd( +					bp, f_obj, BNX2X_F_CMD_SWITCH_UPDATE)) +					break; -			/* We will perform the Queues update from sp_rtnl task -			 * as all Queue SP operations should run under -			 * rtnl_lock. -			 */ -			smp_mb__before_clear_bit(); -			set_bit(BNX2X_SP_RTNL_AFEX_F_UPDATE, -				&bp->sp_rtnl_state); -			smp_mb__after_clear_bit(); +			} else { +				DP(BNX2X_MSG_SP | BNX2X_MSG_MCP, +				   "AFEX: ramrod completed FUNCTION_UPDATE\n"); +				f_obj->complete_cmd(bp, f_obj, +						    BNX2X_F_CMD_AFEX_UPDATE); + +				/* We will perform the Queues update from +				 * sp_rtnl task as all Queue SP operations +				 * should run under rtnl_lock. +				 */ +				smp_mb__before_clear_bit(); +				set_bit(BNX2X_SP_RTNL_AFEX_F_UPDATE, +					&bp->sp_rtnl_state); +				smp_mb__after_clear_bit(); + +				schedule_delayed_work(&bp->sp_rtnl_task, 0); +			} -			schedule_delayed_work(&bp->sp_rtnl_task, 0);  			goto next_spqe;  		case EVENT_RING_OPCODE_AFEX_VIF_LISTS: @@ -4999,11 +5016,10 @@ static void bnx2x_sp_task(struct work_struct *work)  	/* SP events: STAT_QUERY and others */  	if (status & BNX2X_DEF_SB_IDX) { -#ifdef BCM_CNIC  		struct bnx2x_fastpath *fp = bnx2x_fcoe_fp(bp); -		if ((!NO_FCOE(bp)) && -			(bnx2x_has_rx_work(fp) || bnx2x_has_tx_work(fp))) { +		if (FCOE_INIT(bp) && +		    (bnx2x_has_rx_work(fp) || bnx2x_has_tx_work(fp))) {  			/*  			 * Prevent local bottom-halves from running as  			 * we are going to change the local NAPI list. @@ -5012,7 +5028,7 @@ static void bnx2x_sp_task(struct work_struct *work)  			napi_schedule(&bnx2x_fcoe(bp, napi));  			local_bh_enable();  		} -#endif +  		/* Handle EQ completions */  		bnx2x_eq_int(bp); @@ -5050,8 +5066,7 @@ irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance)  		return IRQ_HANDLED;  #endif -#ifdef BCM_CNIC -	{ +	if (CNIC_LOADED(bp)) {  		struct cnic_ops *c_ops;  		rcu_read_lock(); @@ -5060,7 +5075,7 @@ irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance)  			c_ops->cnic_handler(bp->cnic_data, NULL);  		rcu_read_unlock();  	} -#endif +  	queue_delayed_work(bnx2x_wq, &bp->sp_task, 0);  	return IRQ_HANDLED; @@ -5498,12 +5513,10 @@ void bnx2x_set_storm_rx_mode(struct bnx2x *bp)  	unsigned long rx_mode_flags = 0, ramrod_flags = 0;  	unsigned long rx_accept_flags = 0, tx_accept_flags = 0; -#ifdef BCM_CNIC  	if (!NO_FCOE(bp))  		/* Configure rx_mode of FCoE Queue */  		__set_bit(BNX2X_RX_MODE_FCOE_ETH, &rx_mode_flags); -#endif  	switch (bp->rx_mode) {  	case BNX2X_RX_MODE_NONE: @@ -5624,12 +5637,12 @@ static void bnx2x_init_internal(struct bnx2x *bp, u32 load_code)  static inline u8 bnx2x_fp_igu_sb_id(struct bnx2x_fastpath *fp)  { -	return fp->bp->igu_base_sb + fp->index + CNIC_PRESENT; +	return fp->bp->igu_base_sb + fp->index + CNIC_SUPPORT(fp->bp);  }  static inline u8 bnx2x_fp_fw_sb_id(struct bnx2x_fastpath *fp)  { -	return fp->bp->base_fw_ndsb + fp->index + CNIC_PRESENT; +	return fp->bp->base_fw_ndsb + fp->index + CNIC_SUPPORT(fp->bp);  }  static u8 bnx2x_fp_cl_id(struct bnx2x_fastpath *fp) @@ -5720,23 +5733,25 @@ static void bnx2x_init_tx_ring_one(struct bnx2x_fp_txdata *txdata)  	txdata->tx_pkt = 0;  } +static void bnx2x_init_tx_rings_cnic(struct bnx2x *bp) +{ +	int i; + +	for_each_tx_queue_cnic(bp, i) +		bnx2x_init_tx_ring_one(bp->fp[i].txdata_ptr[0]); +}  static void bnx2x_init_tx_rings(struct bnx2x *bp)  {  	int i;  	u8 cos; -	for_each_tx_queue(bp, i) +	for_each_eth_queue(bp, i)  		for_each_cos_in_tx_queue(&bp->fp[i], cos)  			bnx2x_init_tx_ring_one(bp->fp[i].txdata_ptr[cos]);  } -void bnx2x_nic_init(struct bnx2x *bp, u32 load_code) +void bnx2x_nic_init_cnic(struct bnx2x *bp)  { -	int i; - -	for_each_eth_queue(bp, i) -		bnx2x_init_eth_fp(bp, i); -#ifdef BCM_CNIC  	if (!NO_FCOE(bp))  		bnx2x_init_fcoe_fp(bp); @@ -5744,8 +5759,22 @@ void bnx2x_nic_init(struct bnx2x *bp, u32 load_code)  		      BNX2X_VF_ID_INVALID, false,  		      bnx2x_cnic_fw_sb_id(bp), bnx2x_cnic_igu_sb_id(bp)); -#endif +	/* ensure status block indices were read */ +	rmb(); +	bnx2x_init_rx_rings_cnic(bp); +	bnx2x_init_tx_rings_cnic(bp); + +	/* flush all */ +	mb(); +	mmiowb(); +} +void bnx2x_nic_init(struct bnx2x *bp, u32 load_code) +{ +	int i; + +	for_each_eth_queue(bp, i) +		bnx2x_init_eth_fp(bp, i);  	/* Initialize MOD_ABS interrupts */  	bnx2x_init_mod_abs_int(bp, &bp->link_vars, bp->common.chip_id,  			       bp->common.shmem_base, bp->common.shmem2_base, @@ -6031,10 +6060,9 @@ static int bnx2x_int_mem_test(struct bnx2x *bp)  	msleep(50);  	bnx2x_init_block(bp, BLOCK_BRB1, PHASE_COMMON);  	bnx2x_init_block(bp, BLOCK_PRS, PHASE_COMMON); -#ifndef BCM_CNIC -	/* set NIC mode */ -	REG_WR(bp, PRS_REG_NIC_MODE, 1); -#endif +	if (!CNIC_SUPPORT(bp)) +		/* set NIC mode */ +		REG_WR(bp, PRS_REG_NIC_MODE, 1);  	/* Enable inputs of parser neighbor blocks */  	REG_WR(bp, TSDM_REG_ENABLE_IN1, 0x7fffffff); @@ -6049,6 +6077,8 @@ static int bnx2x_int_mem_test(struct bnx2x *bp)  static void bnx2x_enable_blocks_attention(struct bnx2x *bp)  { +	u32 val; +  	REG_WR(bp, PXP_REG_PXP_INT_MASK_0, 0);  	if (!CHIP_IS_E1x(bp))  		REG_WR(bp, PXP_REG_PXP_INT_MASK_1, 0x40); @@ -6082,17 +6112,14 @@ static void bnx2x_enable_blocks_attention(struct bnx2x *bp)  /*	REG_WR(bp, CSEM_REG_CSEM_INT_MASK_0, 0); */  /*	REG_WR(bp, CSEM_REG_CSEM_INT_MASK_1, 0); */ -	if (CHIP_REV_IS_FPGA(bp)) -		REG_WR(bp, PXP2_REG_PXP2_INT_MASK_0, 0x580000); -	else if (!CHIP_IS_E1x(bp)) -		REG_WR(bp, PXP2_REG_PXP2_INT_MASK_0, -			   (PXP2_PXP2_INT_MASK_0_REG_PGL_CPL_OF -				| PXP2_PXP2_INT_MASK_0_REG_PGL_CPL_AFT -				| PXP2_PXP2_INT_MASK_0_REG_PGL_PCIE_ATTN -				| PXP2_PXP2_INT_MASK_0_REG_PGL_READ_BLOCKED -				| PXP2_PXP2_INT_MASK_0_REG_PGL_WRITE_BLOCKED)); -	else -		REG_WR(bp, PXP2_REG_PXP2_INT_MASK_0, 0x480000); +	val = PXP2_PXP2_INT_MASK_0_REG_PGL_CPL_AFT  | +		PXP2_PXP2_INT_MASK_0_REG_PGL_CPL_OF | +		PXP2_PXP2_INT_MASK_0_REG_PGL_PCIE_ATTN; +	if (!CHIP_IS_E1x(bp)) +		val |= PXP2_PXP2_INT_MASK_0_REG_PGL_READ_BLOCKED | +			PXP2_PXP2_INT_MASK_0_REG_PGL_WRITE_BLOCKED; +	REG_WR(bp, PXP2_REG_PXP2_INT_MASK_0, val); +  	REG_WR(bp, TSDM_REG_TSDM_INT_MASK_0, 0);  	REG_WR(bp, TSDM_REG_TSDM_INT_MASK_1, 0);  	REG_WR(bp, TCM_REG_TCM_INT_MASK, 0); @@ -6185,18 +6212,16 @@ static void bnx2x_setup_fan_failure_detection(struct bnx2x *bp)  		return;  	/* Fan failure is indicated by SPIO 5 */ -	bnx2x_set_spio(bp, MISC_REGISTERS_SPIO_5, -		       MISC_REGISTERS_SPIO_INPUT_HI_Z); +	bnx2x_set_spio(bp, MISC_SPIO_SPIO5, MISC_SPIO_INPUT_HI_Z);  	/* set to active low mode */  	val = REG_RD(bp, MISC_REG_SPIO_INT); -	val |= ((1 << MISC_REGISTERS_SPIO_5) << -					MISC_REGISTERS_SPIO_INT_OLD_SET_POS); +	val |= (MISC_SPIO_SPIO5 << MISC_SPIO_INT_OLD_SET_POS);  	REG_WR(bp, MISC_REG_SPIO_INT, val);  	/* enable interrupt to signal the IGU */  	val = REG_RD(bp, MISC_REG_SPIO_EVENT_EN); -	val |= (1 << MISC_REGISTERS_SPIO_5); +	val |= MISC_SPIO_SPIO5;  	REG_WR(bp, MISC_REG_SPIO_EVENT_EN, val);  } @@ -6256,6 +6281,10 @@ void bnx2x_pf_disable(struct bnx2x *bp)  static void bnx2x__common_init_phy(struct bnx2x *bp)  {  	u32 shmem_base[2], shmem2_base[2]; +	/* Avoid common init in case MFW supports LFA */ +	if (SHMEM2_RD(bp, size) > +	    (u32)offsetof(struct shmem2_region, lfa_host_addr[BP_PORT(bp)])) +		return;  	shmem_base[0] =  bp->common.shmem_base;  	shmem2_base[0] = bp->common.shmem2_base;  	if (!CHIP_IS_E1x(bp)) { @@ -6522,9 +6551,8 @@ static int bnx2x_init_hw_common(struct bnx2x *bp)  	REG_WR(bp, QM_REG_SOFT_RESET, 1);  	REG_WR(bp, QM_REG_SOFT_RESET, 0); -#ifdef BCM_CNIC -	bnx2x_init_block(bp, BLOCK_TM, PHASE_COMMON); -#endif +	if (CNIC_SUPPORT(bp)) +		bnx2x_init_block(bp, BLOCK_TM, PHASE_COMMON);  	bnx2x_init_block(bp, BLOCK_DORQ, PHASE_COMMON);  	REG_WR(bp, DORQ_REG_DPM_CID_OFST, BNX2X_DB_SHIFT); @@ -6611,18 +6639,18 @@ static int bnx2x_init_hw_common(struct bnx2x *bp)  	bnx2x_init_block(bp, BLOCK_SRC, PHASE_COMMON); -#ifdef BCM_CNIC -	REG_WR(bp, SRC_REG_KEYSEARCH_0, 0x63285672); -	REG_WR(bp, SRC_REG_KEYSEARCH_1, 0x24b8f2cc); -	REG_WR(bp, SRC_REG_KEYSEARCH_2, 0x223aef9b); -	REG_WR(bp, SRC_REG_KEYSEARCH_3, 0x26001e3a); -	REG_WR(bp, SRC_REG_KEYSEARCH_4, 0x7ae91116); -	REG_WR(bp, SRC_REG_KEYSEARCH_5, 0x5ce5230b); -	REG_WR(bp, SRC_REG_KEYSEARCH_6, 0x298d8adf); -	REG_WR(bp, SRC_REG_KEYSEARCH_7, 0x6eb0ff09); -	REG_WR(bp, SRC_REG_KEYSEARCH_8, 0x1830f82f); -	REG_WR(bp, SRC_REG_KEYSEARCH_9, 0x01e46be7); -#endif +	if (CNIC_SUPPORT(bp)) { +		REG_WR(bp, SRC_REG_KEYSEARCH_0, 0x63285672); +		REG_WR(bp, SRC_REG_KEYSEARCH_1, 0x24b8f2cc); +		REG_WR(bp, SRC_REG_KEYSEARCH_2, 0x223aef9b); +		REG_WR(bp, SRC_REG_KEYSEARCH_3, 0x26001e3a); +		REG_WR(bp, SRC_REG_KEYSEARCH_4, 0x7ae91116); +		REG_WR(bp, SRC_REG_KEYSEARCH_5, 0x5ce5230b); +		REG_WR(bp, SRC_REG_KEYSEARCH_6, 0x298d8adf); +		REG_WR(bp, SRC_REG_KEYSEARCH_7, 0x6eb0ff09); +		REG_WR(bp, SRC_REG_KEYSEARCH_8, 0x1830f82f); +		REG_WR(bp, SRC_REG_KEYSEARCH_9, 0x01e46be7); +	}  	REG_WR(bp, SRC_REG_SOFT_RST, 0);  	if (sizeof(union cdu_context) != 1024) @@ -6786,11 +6814,11 @@ static int bnx2x_init_hw_port(struct bnx2x *bp)  	/* QM cid (connection) count */  	bnx2x_qm_init_cid_count(bp, bp->qm_cid_count, INITOP_SET); -#ifdef BCM_CNIC -	bnx2x_init_block(bp, BLOCK_TM, init_phase); -	REG_WR(bp, TM_REG_LIN0_SCAN_TIME + port*4, 20); -	REG_WR(bp, TM_REG_LIN0_MAX_ACTIVE_CID + port*4, 31); -#endif +	if (CNIC_SUPPORT(bp)) { +		bnx2x_init_block(bp, BLOCK_TM, init_phase); +		REG_WR(bp, TM_REG_LIN0_SCAN_TIME + port*4, 20); +		REG_WR(bp, TM_REG_LIN0_MAX_ACTIVE_CID + port*4, 31); +	}  	bnx2x_init_block(bp, BLOCK_DORQ, init_phase); @@ -6877,9 +6905,9 @@ static int bnx2x_init_hw_port(struct bnx2x *bp)  		REG_WR(bp, PBF_REG_INIT_P0 + port*4, 0);  	} -#ifdef BCM_CNIC -	bnx2x_init_block(bp, BLOCK_SRC, init_phase); -#endif +	if (CNIC_SUPPORT(bp)) +		bnx2x_init_block(bp, BLOCK_SRC, init_phase); +  	bnx2x_init_block(bp, BLOCK_CDU, init_phase);  	bnx2x_init_block(bp, BLOCK_CFC, init_phase); @@ -6955,7 +6983,7 @@ static int bnx2x_init_hw_port(struct bnx2x *bp)  	/* If SPIO5 is set to generate interrupts, enable it for this port */  	val = REG_RD(bp, MISC_REG_SPIO_EVENT_EN); -	if (val & (1 << MISC_REGISTERS_SPIO_5)) { +	if (val & MISC_SPIO_SPIO5) {  		u32 reg_addr = (port ? MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0 :  				       MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0);  		val = REG_RD(bp, reg_addr); @@ -7040,6 +7068,130 @@ static void bnx2x_clear_func_ilt(struct bnx2x *bp, u32 func)  		bnx2x_ilt_wr(bp, i, 0);  } + +static void bnx2x_init_searcher(struct bnx2x *bp) +{ +	int port = BP_PORT(bp); +	bnx2x_src_init_t2(bp, bp->t2, bp->t2_mapping, SRC_CONN_NUM); +	/* T1 hash bits value determines the T1 number of entries */ +	REG_WR(bp, SRC_REG_NUMBER_HASH_BITS0 + port*4, SRC_HASH_BITS); +} + +static inline int bnx2x_func_switch_update(struct bnx2x *bp, int suspend) +{ +	int rc; +	struct bnx2x_func_state_params func_params = {NULL}; +	struct bnx2x_func_switch_update_params *switch_update_params = +		&func_params.params.switch_update; + +	/* Prepare parameters for function state transitions */ +	__set_bit(RAMROD_COMP_WAIT, &func_params.ramrod_flags); +	__set_bit(RAMROD_RETRY, &func_params.ramrod_flags); + +	func_params.f_obj = &bp->func_obj; +	func_params.cmd = BNX2X_F_CMD_SWITCH_UPDATE; + +	/* Function parameters */ +	switch_update_params->suspend = suspend; + +	rc = bnx2x_func_state_change(bp, &func_params); + +	return rc; +} + +static int bnx2x_reset_nic_mode(struct bnx2x *bp) +{ +	int rc, i, port = BP_PORT(bp); +	int vlan_en = 0, mac_en[NUM_MACS]; + + +	/* Close input from network */ +	if (bp->mf_mode == SINGLE_FUNCTION) { +		bnx2x_set_rx_filter(&bp->link_params, 0); +	} else { +		vlan_en = REG_RD(bp, port ? NIG_REG_LLH1_FUNC_EN : +				   NIG_REG_LLH0_FUNC_EN); +		REG_WR(bp, port ? NIG_REG_LLH1_FUNC_EN : +			  NIG_REG_LLH0_FUNC_EN, 0); +		for (i = 0; i < NUM_MACS; i++) { +			mac_en[i] = REG_RD(bp, port ? +					     (NIG_REG_LLH1_FUNC_MEM_ENABLE + +					      4 * i) : +					     (NIG_REG_LLH0_FUNC_MEM_ENABLE + +					      4 * i)); +			REG_WR(bp, port ? (NIG_REG_LLH1_FUNC_MEM_ENABLE + +					      4 * i) : +				  (NIG_REG_LLH0_FUNC_MEM_ENABLE + 4 * i), 0); +		} +	} + +	/* Close BMC to host */ +	REG_WR(bp, port ? NIG_REG_P0_TX_MNG_HOST_ENABLE : +	       NIG_REG_P1_TX_MNG_HOST_ENABLE, 0); + +	/* Suspend Tx switching to the PF. Completion of this ramrod +	 * further guarantees that all the packets of that PF / child +	 * VFs in BRB were processed by the Parser, so it is safe to +	 * change the NIC_MODE register. +	 */ +	rc = bnx2x_func_switch_update(bp, 1); +	if (rc) { +		BNX2X_ERR("Can't suspend tx-switching!\n"); +		return rc; +	} + +	/* Change NIC_MODE register */ +	REG_WR(bp, PRS_REG_NIC_MODE, 0); + +	/* Open input from network */ +	if (bp->mf_mode == SINGLE_FUNCTION) { +		bnx2x_set_rx_filter(&bp->link_params, 1); +	} else { +		REG_WR(bp, port ? NIG_REG_LLH1_FUNC_EN : +			  NIG_REG_LLH0_FUNC_EN, vlan_en); +		for (i = 0; i < NUM_MACS; i++) { +			REG_WR(bp, port ? (NIG_REG_LLH1_FUNC_MEM_ENABLE + +					      4 * i) : +				  (NIG_REG_LLH0_FUNC_MEM_ENABLE + 4 * i), +				  mac_en[i]); +		} +	} + +	/* Enable BMC to host */ +	REG_WR(bp, port ? NIG_REG_P0_TX_MNG_HOST_ENABLE : +	       NIG_REG_P1_TX_MNG_HOST_ENABLE, 1); + +	/* Resume Tx switching to the PF */ +	rc = bnx2x_func_switch_update(bp, 0); +	if (rc) { +		BNX2X_ERR("Can't resume tx-switching!\n"); +		return rc; +	} + +	DP(NETIF_MSG_IFUP, "NIC MODE disabled\n"); +	return 0; +} + +int bnx2x_init_hw_func_cnic(struct bnx2x *bp) +{ +	int rc; + +	bnx2x_ilt_init_op_cnic(bp, INITOP_SET); + +	if (CONFIGURE_NIC_MODE(bp)) { +		/* Configrue searcher as part of function hw init */ +		bnx2x_init_searcher(bp); + +		/* Reset NIC mode */ +		rc = bnx2x_reset_nic_mode(bp); +		if (rc) +			BNX2X_ERR("Can't change NIC mode!\n"); +		return rc; +	} + +	return 0; +} +  static int bnx2x_init_hw_func(struct bnx2x *bp)  {  	int port = BP_PORT(bp); @@ -7082,17 +7234,16 @@ static int bnx2x_init_hw_func(struct bnx2x *bp)  	}  	bnx2x_ilt_init_op(bp, INITOP_SET); -#ifdef BCM_CNIC -	bnx2x_src_init_t2(bp, bp->t2, bp->t2_mapping, SRC_CONN_NUM); - -	/* T1 hash bits value determines the T1 number of entries */ -	REG_WR(bp, SRC_REG_NUMBER_HASH_BITS0 + port*4, SRC_HASH_BITS); -#endif +	if (!CONFIGURE_NIC_MODE(bp)) { +		bnx2x_init_searcher(bp); +		REG_WR(bp, PRS_REG_NIC_MODE, 0); +		DP(NETIF_MSG_IFUP, "NIC MODE disabled\n"); +	} else { +		/* Set NIC mode */ +		REG_WR(bp, PRS_REG_NIC_MODE, 1); +		DP(NETIF_MSG_IFUP, "NIC MODE configrued\n"); -#ifndef BCM_CNIC -	/* set NIC mode */ -	REG_WR(bp, PRS_REG_NIC_MODE, 1); -#endif  /* BCM_CNIC */ +	}  	if (!CHIP_IS_E1x(bp)) {  		u32 pf_conf = IGU_PF_CONF_FUNC_EN; @@ -7343,6 +7494,20 @@ static int bnx2x_init_hw_func(struct bnx2x *bp)  } +void bnx2x_free_mem_cnic(struct bnx2x *bp) +{ +	bnx2x_ilt_mem_op_cnic(bp, ILT_MEMOP_FREE); + +	if (!CHIP_IS_E1x(bp)) +		BNX2X_PCI_FREE(bp->cnic_sb.e2_sb, bp->cnic_sb_mapping, +			       sizeof(struct host_hc_status_block_e2)); +	else +		BNX2X_PCI_FREE(bp->cnic_sb.e1x_sb, bp->cnic_sb_mapping, +			       sizeof(struct host_hc_status_block_e1x)); + +	BNX2X_PCI_FREE(bp->t2, bp->t2_mapping, SRC_T2_SZ); +} +  void bnx2x_free_mem(struct bnx2x *bp)  {  	int i; @@ -7367,17 +7532,6 @@ void bnx2x_free_mem(struct bnx2x *bp)  	BNX2X_FREE(bp->ilt->lines); -#ifdef BCM_CNIC -	if (!CHIP_IS_E1x(bp)) -		BNX2X_PCI_FREE(bp->cnic_sb.e2_sb, bp->cnic_sb_mapping, -			       sizeof(struct host_hc_status_block_e2)); -	else -		BNX2X_PCI_FREE(bp->cnic_sb.e1x_sb, bp->cnic_sb_mapping, -			       sizeof(struct host_hc_status_block_e1x)); - -	BNX2X_PCI_FREE(bp->t2, bp->t2_mapping, SRC_T2_SZ); -#endif -  	BNX2X_PCI_FREE(bp->spq, bp->spq_mapping, BCM_PAGE_SIZE);  	BNX2X_PCI_FREE(bp->eq_ring, bp->eq_mapping, @@ -7445,24 +7599,44 @@ alloc_mem_err:  	return -ENOMEM;  } - -int bnx2x_alloc_mem(struct bnx2x *bp) +int bnx2x_alloc_mem_cnic(struct bnx2x *bp)  { -	int i, allocated, context_size; - -#ifdef BCM_CNIC  	if (!CHIP_IS_E1x(bp))  		/* size = the status block + ramrod buffers */  		BNX2X_PCI_ALLOC(bp->cnic_sb.e2_sb, &bp->cnic_sb_mapping,  				sizeof(struct host_hc_status_block_e2));  	else -		BNX2X_PCI_ALLOC(bp->cnic_sb.e1x_sb, &bp->cnic_sb_mapping, -				sizeof(struct host_hc_status_block_e1x)); +		BNX2X_PCI_ALLOC(bp->cnic_sb.e1x_sb, +				&bp->cnic_sb_mapping, +				sizeof(struct +				       host_hc_status_block_e1x)); -	/* allocate searcher T2 table */ -	BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ); -#endif +	if (CONFIGURE_NIC_MODE(bp)) +		/* allocate searcher T2 table, as it wan't allocated before */ +		BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ); + +	/* write address to which L5 should insert its values */ +	bp->cnic_eth_dev.addr_drv_info_to_mcp = +		&bp->slowpath->drv_info_to_mcp; +	if (bnx2x_ilt_mem_op_cnic(bp, ILT_MEMOP_ALLOC)) +		goto alloc_mem_err; + +	return 0; + +alloc_mem_err: +	bnx2x_free_mem_cnic(bp); +	BNX2X_ERR("Can't allocate memory\n"); +	return -ENOMEM; +} + +int bnx2x_alloc_mem(struct bnx2x *bp) +{ +	int i, allocated, context_size; + +	if (!CONFIGURE_NIC_MODE(bp)) +		/* allocate searcher T2 table */ +		BNX2X_PCI_ALLOC(bp->t2, &bp->t2_mapping, SRC_T2_SZ);  	BNX2X_PCI_ALLOC(bp->def_status_blk, &bp->def_status_blk_mapping,  			sizeof(struct host_sp_status_block)); @@ -7470,11 +7644,6 @@ int bnx2x_alloc_mem(struct bnx2x *bp)  	BNX2X_PCI_ALLOC(bp->slowpath, &bp->slowpath_mapping,  			sizeof(struct bnx2x_slowpath)); -#ifdef BCM_CNIC -	/* write address to which L5 should insert its values */ -	bp->cnic_eth_dev.addr_drv_info_to_mcp = &bp->slowpath->drv_info_to_mcp; -#endif -  	/* Allocated memory for FW statistics  */  	if (bnx2x_alloc_fw_stats_mem(bp))  		goto alloc_mem_err; @@ -7596,14 +7765,12 @@ int bnx2x_set_eth_mac(struct bnx2x *bp, bool set)  {  	unsigned long ramrod_flags = 0; -#ifdef BCM_CNIC  	if (is_zero_ether_addr(bp->dev->dev_addr) &&  	    (IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp))) {  		DP(NETIF_MSG_IFUP | NETIF_MSG_IFDOWN,  		   "Ignoring Zero MAC for STORAGE SD mode\n");  		return 0;  	} -#endif  	DP(NETIF_MSG_IFUP, "Adding Eth MAC\n"); @@ -7632,7 +7799,8 @@ void bnx2x_set_int_mode(struct bnx2x *bp)  		bnx2x_enable_msi(bp);  		/* falling through... */  	case INT_MODE_INTx: -		bp->num_queues = 1 + NON_ETH_CONTEXT_USE; +		bp->num_ethernet_queues = 1; +		bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues;  		BNX2X_DEV_INFO("set number of queues to 1\n");  		break;  	default: @@ -7644,9 +7812,10 @@ void bnx2x_set_int_mode(struct bnx2x *bp)  		    bp->flags & USING_SINGLE_MSIX_FLAG) {  			/* failed to enable multiple MSI-X */  			BNX2X_DEV_INFO("Failed to enable multiple MSI-X (%d), set number of queues to %d\n", -				       bp->num_queues, 1 + NON_ETH_CONTEXT_USE); +				       bp->num_queues, +				       1 + bp->num_cnic_queues); -			bp->num_queues = 1 + NON_ETH_CONTEXT_USE; +			bp->num_queues = 1 + bp->num_cnic_queues;  			/* Try to enable MSI */  			if (!(bp->flags & USING_SINGLE_MSIX_FLAG) && @@ -7679,9 +7848,9 @@ void bnx2x_ilt_set_info(struct bnx2x *bp)  	ilt_client->flags = ILT_CLIENT_SKIP_MEM;  	ilt_client->start = line;  	line += bnx2x_cid_ilt_lines(bp); -#ifdef BCM_CNIC -	line += CNIC_ILT_LINES; -#endif + +	if (CNIC_SUPPORT(bp)) +		line += CNIC_ILT_LINES;  	ilt_client->end = line - 1;  	DP(NETIF_MSG_IFUP, "ilt client[CDU]: start %d, end %d, psz 0x%x, flags 0x%x, hw psz %d\n", @@ -7714,49 +7883,43 @@ void bnx2x_ilt_set_info(struct bnx2x *bp)  		   ilog2(ilt_client->page_size >> 12));  	} -	/* SRC */ -	ilt_client = &ilt->clients[ILT_CLIENT_SRC]; -#ifdef BCM_CNIC -	ilt_client->client_num = ILT_CLIENT_SRC; -	ilt_client->page_size = SRC_ILT_PAGE_SZ; -	ilt_client->flags = 0; -	ilt_client->start = line; -	line += SRC_ILT_LINES; -	ilt_client->end = line - 1; -	DP(NETIF_MSG_IFUP, -	   "ilt client[SRC]: start %d, end %d, psz 0x%x, flags 0x%x, hw psz %d\n", -	   ilt_client->start, -	   ilt_client->end, -	   ilt_client->page_size, -	   ilt_client->flags, -	   ilog2(ilt_client->page_size >> 12)); +	if (CNIC_SUPPORT(bp)) { +		/* SRC */ +		ilt_client = &ilt->clients[ILT_CLIENT_SRC]; +		ilt_client->client_num = ILT_CLIENT_SRC; +		ilt_client->page_size = SRC_ILT_PAGE_SZ; +		ilt_client->flags = 0; +		ilt_client->start = line; +		line += SRC_ILT_LINES; +		ilt_client->end = line - 1; -#else -	ilt_client->flags = (ILT_CLIENT_SKIP_INIT | ILT_CLIENT_SKIP_MEM); -#endif +		DP(NETIF_MSG_IFUP, +		   "ilt client[SRC]: start %d, end %d, psz 0x%x, flags 0x%x, hw psz %d\n", +		   ilt_client->start, +		   ilt_client->end, +		   ilt_client->page_size, +		   ilt_client->flags, +		   ilog2(ilt_client->page_size >> 12)); -	/* TM */ -	ilt_client = &ilt->clients[ILT_CLIENT_TM]; -#ifdef BCM_CNIC -	ilt_client->client_num = ILT_CLIENT_TM; -	ilt_client->page_size = TM_ILT_PAGE_SZ; -	ilt_client->flags = 0; -	ilt_client->start = line; -	line += TM_ILT_LINES; -	ilt_client->end = line - 1; +		/* TM */ +		ilt_client = &ilt->clients[ILT_CLIENT_TM]; +		ilt_client->client_num = ILT_CLIENT_TM; +		ilt_client->page_size = TM_ILT_PAGE_SZ; +		ilt_client->flags = 0; +		ilt_client->start = line; +		line += TM_ILT_LINES; +		ilt_client->end = line - 1; -	DP(NETIF_MSG_IFUP, -	   "ilt client[TM]: start %d, end %d, psz 0x%x, flags 0x%x, hw psz %d\n", -	   ilt_client->start, -	   ilt_client->end, -	   ilt_client->page_size, -	   ilt_client->flags, -	   ilog2(ilt_client->page_size >> 12)); +		DP(NETIF_MSG_IFUP, +		   "ilt client[TM]: start %d, end %d, psz 0x%x, flags 0x%x, hw psz %d\n", +		   ilt_client->start, +		   ilt_client->end, +		   ilt_client->page_size, +		   ilt_client->flags, +		   ilog2(ilt_client->page_size >> 12)); +	} -#else -	ilt_client->flags = (ILT_CLIENT_SKIP_INIT | ILT_CLIENT_SKIP_MEM); -#endif  	BUG_ON(line > ILT_MAX_LINES);  } @@ -7823,7 +7986,7 @@ static void bnx2x_pf_q_prep_init(struct bnx2x *bp,  	}  } -int bnx2x_setup_tx_only(struct bnx2x *bp, struct bnx2x_fastpath *fp, +static int bnx2x_setup_tx_only(struct bnx2x *bp, struct bnx2x_fastpath *fp,  			struct bnx2x_queue_state_params *q_params,  			struct bnx2x_queue_setup_tx_only_params *tx_only_params,  			int tx_index, bool leading) @@ -7924,6 +8087,9 @@ int bnx2x_setup_queue(struct bnx2x *bp, struct bnx2x_fastpath *fp,  	/* Set the command */  	q_params.cmd = BNX2X_Q_CMD_SETUP; +	if (IS_FCOE_FP(fp)) +		bp->fcoe_init = true; +  	/* Change the state to SETUP */  	rc = bnx2x_queue_state_change(bp, &q_params);  	if (rc) { @@ -8037,12 +8203,12 @@ static void bnx2x_reset_func(struct bnx2x *bp)  			   SB_DISABLED);  	} -#ifdef BCM_CNIC -	/* CNIC SB */ -	REG_WR8(bp, BAR_CSTRORM_INTMEM + -		CSTORM_STATUS_BLOCK_DATA_STATE_OFFSET(bnx2x_cnic_fw_sb_id(bp)), -		SB_DISABLED); -#endif +	if (CNIC_LOADED(bp)) +		/* CNIC SB */ +		REG_WR8(bp, BAR_CSTRORM_INTMEM + +			CSTORM_STATUS_BLOCK_DATA_STATE_OFFSET +			(bnx2x_cnic_fw_sb_id(bp)), SB_DISABLED); +  	/* SP SB */  	REG_WR8(bp, BAR_CSTRORM_INTMEM +  		   CSTORM_SP_STATUS_BLOCK_DATA_STATE_OFFSET(func), @@ -8061,19 +8227,19 @@ static void bnx2x_reset_func(struct bnx2x *bp)  		REG_WR(bp, IGU_REG_TRAILING_EDGE_LATCH, 0);  	} -#ifdef BCM_CNIC -	/* Disable Timer scan */ -	REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 0); -	/* -	 * Wait for at least 10ms and up to 2 second for the timers scan to -	 * complete -	 */ -	for (i = 0; i < 200; i++) { -		msleep(10); -		if (!REG_RD(bp, TM_REG_LIN0_SCAN_ON + port*4)) -			break; +	if (CNIC_LOADED(bp)) { +		/* Disable Timer scan */ +		REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 0); +		/* +		 * Wait for at least 10ms and up to 2 second for the timers +		 * scan to complete +		 */ +		for (i = 0; i < 200; i++) { +			msleep(10); +			if (!REG_RD(bp, TM_REG_LIN0_SCAN_ON + port*4)) +				break; +		}  	} -#endif  	/* Clear ILT */  	bnx2x_clear_func_ilt(bp, func); @@ -8409,13 +8575,24 @@ void bnx2x_chip_cleanup(struct bnx2x *bp, int unload_mode, bool keep_link)  	/* Close multi and leading connections  	 * Completions for ramrods are collected in a synchronous way  	 */ -	for_each_queue(bp, i) +	for_each_eth_queue(bp, i)  		if (bnx2x_stop_queue(bp, i))  #ifdef BNX2X_STOP_ON_ERROR  			return;  #else  			goto unload_error;  #endif + +	if (CNIC_LOADED(bp)) { +		for_each_cnic_queue(bp, i) +			if (bnx2x_stop_queue(bp, i)) +#ifdef BNX2X_STOP_ON_ERROR +				return; +#else +				goto unload_error; +#endif +	} +  	/* If SP settings didn't get completed so far - something  	 * very wrong has happen.  	 */ @@ -8437,6 +8614,8 @@ unload_error:  	bnx2x_netif_stop(bp, 1);  	/* Delete all NAPI objects */  	bnx2x_del_all_napi(bp); +	if (CNIC_LOADED(bp)) +		bnx2x_del_all_napi_cnic(bp);  	/* Release IRQs */  	bnx2x_free_irq(bp); @@ -8558,7 +8737,8 @@ static void bnx2x_reset_mcp_prep(struct bnx2x *bp, u32 *magic_val)  	/* Get shmem offset */  	shmem = REG_RD(bp, MISC_REG_SHARED_MEM_ADDR); -	validity_offset = offsetof(struct shmem_region, validity_map[0]); +	validity_offset = +		offsetof(struct shmem_region, validity_map[BP_PORT(bp)]);  	/* Clear validity map flags */  	if (shmem > 0) @@ -8651,7 +8831,11 @@ static void bnx2x_process_kill_chip_reset(struct bnx2x *bp, bool global)  		MISC_REGISTERS_RESET_REG_2_RST_MCP_N_RESET_CMN_CPU |  		MISC_REGISTERS_RESET_REG_2_RST_MCP_N_RESET_CMN_CORE; -	/* Don't reset the following blocks */ +	/* Don't reset the following blocks. +	 * Important: per port blocks (such as EMAC, BMAC, UMAC) can't be +	 *            reset, as in 4 port device they might still be owned +	 *            by the MCP (there is only one leader per path). +	 */  	not_reset_mask1 =  		MISC_REGISTERS_RESET_REG_1_RST_HC |  		MISC_REGISTERS_RESET_REG_1_RST_PXPV | @@ -8667,19 +8851,19 @@ static void bnx2x_process_kill_chip_reset(struct bnx2x *bp, bool global)  		MISC_REGISTERS_RESET_REG_2_RST_MCP_N_RESET_REG_HARD_CORE |  		MISC_REGISTERS_RESET_REG_2_RST_MCP_N_HARD_CORE_RST_B |  		MISC_REGISTERS_RESET_REG_2_RST_ATC | -		MISC_REGISTERS_RESET_REG_2_PGLC; +		MISC_REGISTERS_RESET_REG_2_PGLC | +		MISC_REGISTERS_RESET_REG_2_RST_BMAC0 | +		MISC_REGISTERS_RESET_REG_2_RST_BMAC1 | +		MISC_REGISTERS_RESET_REG_2_RST_EMAC0 | +		MISC_REGISTERS_RESET_REG_2_RST_EMAC1 | +		MISC_REGISTERS_RESET_REG_2_UMAC0 | +		MISC_REGISTERS_RESET_REG_2_UMAC1;  	/*  	 * Keep the following blocks in reset:  	 *  - all xxMACs are handled by the bnx2x_link code.  	 */  	stay_reset2 = -		MISC_REGISTERS_RESET_REG_2_RST_BMAC0 | -		MISC_REGISTERS_RESET_REG_2_RST_BMAC1 | -		MISC_REGISTERS_RESET_REG_2_RST_EMAC0 | -		MISC_REGISTERS_RESET_REG_2_RST_EMAC1 | -		MISC_REGISTERS_RESET_REG_2_UMAC0 | -		MISC_REGISTERS_RESET_REG_2_UMAC1 |  		MISC_REGISTERS_RESET_REG_2_XMAC |  		MISC_REGISTERS_RESET_REG_2_XMAC_SOFT; @@ -8769,6 +8953,7 @@ static int bnx2x_process_kill(struct bnx2x *bp, bool global)  	int cnt = 1000;  	u32 val = 0;  	u32 sr_cnt, blk_cnt, port_is_idle_0, port_is_idle_1, pgl_exp_rom2; +		u32 tags_63_32 = 0;  	/* Empty the Tetris buffer, wait for 1s */ @@ -8778,10 +8963,14 @@ static int bnx2x_process_kill(struct bnx2x *bp, bool global)  		port_is_idle_0 = REG_RD(bp, PXP2_REG_RD_PORT_IS_IDLE_0);  		port_is_idle_1 = REG_RD(bp, PXP2_REG_RD_PORT_IS_IDLE_1);  		pgl_exp_rom2 = REG_RD(bp, PXP2_REG_PGL_EXP_ROM2); +		if (CHIP_IS_E3(bp)) +			tags_63_32 = REG_RD(bp, PGLUE_B_REG_TAGS_63_32); +  		if ((sr_cnt == 0x7e) && (blk_cnt == 0xa0) &&  		    ((port_is_idle_0 & 0x1) == 0x1) &&  		    ((port_is_idle_1 & 0x1) == 0x1) && -		    (pgl_exp_rom2 == 0xffffffff)) +		    (pgl_exp_rom2 == 0xffffffff) && +		    (!CHIP_IS_E3(bp) || (tags_63_32 == 0xffffffff)))  			break;  		usleep_range(1000, 1000);  	} while (cnt-- > 0); @@ -8838,9 +9027,6 @@ static int bnx2x_process_kill(struct bnx2x *bp, bool global)  	/* TBD: Add resetting the NO_MCP mode DB here */ -	/* PXP */ -	bnx2x_pxp_prep(bp); -  	/* Open the gates #2, #3 and #4 */  	bnx2x_set_234_gates(bp, false); @@ -8850,7 +9036,7 @@ static int bnx2x_process_kill(struct bnx2x *bp, bool global)  	return 0;  } -int bnx2x_leader_reset(struct bnx2x *bp) +static int bnx2x_leader_reset(struct bnx2x *bp)  {  	int rc = 0;  	bool global = bnx2x_reset_is_global(bp); @@ -9234,7 +9420,7 @@ static inline void bnx2x_undi_int_disable(struct bnx2x *bp)  		bnx2x_undi_int_disable_e1h(bp);  } -static void __devinit bnx2x_prev_unload_close_mac(struct bnx2x *bp) +static void bnx2x_prev_unload_close_mac(struct bnx2x *bp)  {  	u32 val, base_addr, offset, mask, reset_reg;  	bool mac_stopped = false; @@ -9301,8 +9487,7 @@ static void __devinit bnx2x_prev_unload_close_mac(struct bnx2x *bp)  #define BNX2X_PREV_UNDI_BD(val)		((val) >> 16 & 0xffff)  #define BNX2X_PREV_UNDI_PROD(rcq, bd)	((bd) << 16 | (rcq)) -static void __devinit bnx2x_prev_unload_undi_inc(struct bnx2x *bp, u8 port, -						 u8 inc) +static void bnx2x_prev_unload_undi_inc(struct bnx2x *bp, u8 port, u8 inc)  {  	u16 rcq, bd;  	u32 tmp_reg = REG_RD(bp, BNX2X_PREV_UNDI_PROD_ADDR(port)); @@ -9317,7 +9502,7 @@ static void __devinit bnx2x_prev_unload_undi_inc(struct bnx2x *bp, u8 port,  		       port, bd, rcq);  } -static int __devinit bnx2x_prev_mcp_done(struct bnx2x *bp) +static int bnx2x_prev_mcp_done(struct bnx2x *bp)  {  	u32 rc = bnx2x_fw_command(bp, DRV_MSG_CODE_UNLOAD_DONE,  				  DRV_MSG_CODE_UNLOAD_SKIP_LINK_RESET); @@ -9329,7 +9514,21 @@ static int __devinit bnx2x_prev_mcp_done(struct bnx2x *bp)  	return 0;  } -static bool __devinit bnx2x_prev_is_path_marked(struct bnx2x *bp) +static struct bnx2x_prev_path_list * +		bnx2x_prev_path_get_entry(struct bnx2x *bp) +{ +	struct bnx2x_prev_path_list *tmp_list; + +	list_for_each_entry(tmp_list, &bnx2x_prev_list, list) +		if (PCI_SLOT(bp->pdev->devfn) == tmp_list->slot && +		    bp->pdev->bus->number == tmp_list->bus && +		    BP_PATH(bp) == tmp_list->path) +			return tmp_list; + +	return NULL; +} + +static bool bnx2x_prev_is_path_marked(struct bnx2x *bp)  {  	struct bnx2x_prev_path_list *tmp_list;  	int rc = false; @@ -9353,7 +9552,7 @@ static bool __devinit bnx2x_prev_is_path_marked(struct bnx2x *bp)  	return rc;  } -static int __devinit bnx2x_prev_mark_path(struct bnx2x *bp) +static int bnx2x_prev_mark_path(struct bnx2x *bp, bool after_undi)  {  	struct bnx2x_prev_path_list *tmp_list;  	int rc; @@ -9367,6 +9566,7 @@ static int __devinit bnx2x_prev_mark_path(struct bnx2x *bp)  	tmp_list->bus = bp->pdev->bus->number;  	tmp_list->slot = PCI_SLOT(bp->pdev->devfn);  	tmp_list->path = BP_PATH(bp); +	tmp_list->undi = after_undi ? (1 << BP_PORT(bp)) : 0;  	rc = down_interruptible(&bnx2x_prev_sem);  	if (rc) { @@ -9382,7 +9582,7 @@ static int __devinit bnx2x_prev_mark_path(struct bnx2x *bp)  	return rc;  } -static int __devinit bnx2x_do_flr(struct bnx2x *bp) +static int bnx2x_do_flr(struct bnx2x *bp)  {  	int i;  	u16 status; @@ -9422,7 +9622,7 @@ clear:  	return 0;  } -static int __devinit bnx2x_prev_unload_uncommon(struct bnx2x *bp) +static int bnx2x_prev_unload_uncommon(struct bnx2x *bp)  {  	int rc; @@ -9460,9 +9660,10 @@ static int __devinit bnx2x_prev_unload_uncommon(struct bnx2x *bp)  	return rc;  } -static int __devinit bnx2x_prev_unload_common(struct bnx2x *bp) +static int bnx2x_prev_unload_common(struct bnx2x *bp)  {  	u32 reset_reg, tmp_reg = 0, rc; +	bool prev_undi = false;  	/* It is possible a previous function received 'common' answer,  	 * but hasn't loaded yet, therefore creating a scenario of  	 * multiple functions receiving 'common' on the same path. @@ -9477,7 +9678,6 @@ static int __devinit bnx2x_prev_unload_common(struct bnx2x *bp)  	/* Reset should be performed after BRB is emptied */  	if (reset_reg & MISC_REGISTERS_RESET_REG_1_RST_BRB1) {  		u32 timer_count = 1000; -		bool prev_undi = false;  		/* Close the MAC Rx to prevent BRB from filling up */  		bnx2x_prev_unload_close_mac(bp); @@ -9527,7 +9727,7 @@ static int __devinit bnx2x_prev_unload_common(struct bnx2x *bp)  	/* No packets are in the pipeline, path is ready for reset */  	bnx2x_reset_common(bp); -	rc = bnx2x_prev_mark_path(bp); +	rc = bnx2x_prev_mark_path(bp, prev_undi);  	if (rc) {  		bnx2x_prev_mcp_done(bp);  		return rc; @@ -9543,7 +9743,7 @@ static int __devinit bnx2x_prev_unload_common(struct bnx2x *bp)   * to clear the interrupt which detected this from the pglueb and the was done   * bit   */ -static void __devinit bnx2x_prev_interrupted_dmae(struct bnx2x *bp) +static void bnx2x_prev_interrupted_dmae(struct bnx2x *bp)  {  	if (!CHIP_IS_E1x(bp)) {  		u32 val = REG_RD(bp, PGLUE_B_REG_PGLUE_B_INT_STS); @@ -9555,10 +9755,11 @@ static void __devinit bnx2x_prev_interrupted_dmae(struct bnx2x *bp)  	}  } -static int __devinit bnx2x_prev_unload(struct bnx2x *bp) +static int bnx2x_prev_unload(struct bnx2x *bp)  {  	int time_counter = 10;  	u32 rc, fw, hw_lock_reg, hw_lock_val; +	struct bnx2x_prev_path_list *prev_list;  	BNX2X_DEV_INFO("Entering Previous Unload Flow\n");  	/* clear hw from errors which may have resulted from an interrupted @@ -9617,12 +9818,18 @@ static int __devinit bnx2x_prev_unload(struct bnx2x *bp)  		rc = -EBUSY;  	} +	/* Mark function if its port was used to boot from SAN */ +	prev_list = bnx2x_prev_path_get_entry(bp); +	if (prev_list && (prev_list->undi & (1 << BP_PORT(bp)))) +		bp->link_params.feature_config_flags |= +			FEATURE_CONFIG_BOOT_FROM_SAN; +  	BNX2X_DEV_INFO("Finished Previous Unload Flow [%d]\n", rc);  	return rc;  } -static void __devinit bnx2x_get_common_hwinfo(struct bnx2x *bp) +static void bnx2x_get_common_hwinfo(struct bnx2x *bp)  {  	u32 val, val2, val3, val4, id, boot_mode;  	u16 pmc; @@ -9701,6 +9908,14 @@ static void __devinit bnx2x_get_common_hwinfo(struct bnx2x *bp)  	bp->link_params.shmem_base = bp->common.shmem_base;  	bp->link_params.shmem2_base = bp->common.shmem2_base; +	if (SHMEM2_RD(bp, size) > +	    (u32)offsetof(struct shmem2_region, lfa_host_addr[BP_PORT(bp)])) +		bp->link_params.lfa_base = +		REG_RD(bp, bp->common.shmem2_base + +		       (u32)offsetof(struct shmem2_region, +				     lfa_host_addr[BP_PORT(bp)])); +	else +		bp->link_params.lfa_base = 0;  	BNX2X_DEV_INFO("shmem offset 0x%x  shmem2 offset 0x%x\n",  		       bp->common.shmem_base, bp->common.shmem2_base); @@ -9748,6 +9963,11 @@ static void __devinit bnx2x_get_common_hwinfo(struct bnx2x *bp)  	bp->link_params.feature_config_flags |=  		(val >= REQ_BC_VER_4_SFP_TX_DISABLE_SUPPORTED) ?  		FEATURE_CONFIG_BC_SUPPORTS_SFP_TX_DISABLED : 0; + +	bp->link_params.feature_config_flags |= +		(val >= REQ_BC_VER_4_MT_SUPPORTED) ? +		FEATURE_CONFIG_MT_SUPPORT : 0; +  	bp->flags |= (val >= REQ_BC_VER_4_PFC_STATS_SUPPORTED) ?  			BC_SUPPORTS_PFC_STATS : 0; @@ -9792,7 +10012,7 @@ static void __devinit bnx2x_get_common_hwinfo(struct bnx2x *bp)  #define IGU_FID(val)	GET_FIELD((val), IGU_REG_MAPPING_MEMORY_FID)  #define IGU_VEC(val)	GET_FIELD((val), IGU_REG_MAPPING_MEMORY_VECTOR) -static void __devinit bnx2x_get_igu_cam_info(struct bnx2x *bp) +static int bnx2x_get_igu_cam_info(struct bnx2x *bp)  {  	int pfid = BP_FUNC(bp);  	int igu_sb_id; @@ -9809,7 +10029,7 @@ static void __devinit bnx2x_get_igu_cam_info(struct bnx2x *bp)  		bp->igu_dsb_id =  E1HVN_MAX * FP_SB_MAX_E1x +  			(CHIP_MODE_IS_4_PORT(bp) ? pfid : vn); -		return; +		return 0;  	}  	/* IGU in normal mode - read CAM */ @@ -9843,12 +10063,15 @@ static void __devinit bnx2x_get_igu_cam_info(struct bnx2x *bp)  	bp->igu_sb_cnt = min_t(int, bp->igu_sb_cnt, igu_sb_cnt);  #endif -	if (igu_sb_cnt == 0) +	if (igu_sb_cnt == 0) {  		BNX2X_ERR("CAM configuration error\n"); +		return -EINVAL; +	} + +	return 0;  } -static void __devinit bnx2x_link_settings_supported(struct bnx2x *bp, -						    u32 switch_cfg) +static void bnx2x_link_settings_supported(struct bnx2x *bp, u32 switch_cfg)  {  	int cfg_size = 0, idx, port = BP_PORT(bp); @@ -9946,7 +10169,7 @@ static void __devinit bnx2x_link_settings_supported(struct bnx2x *bp,  		       bp->port.supported[1]);  } -static void __devinit bnx2x_link_settings_requested(struct bnx2x *bp) +static void bnx2x_link_settings_requested(struct bnx2x *bp)  {  	u32 link_config, idx, cfg_size = 0;  	bp->port.advertising[0] = 0; @@ -10115,11 +10338,13 @@ static void __devinit bnx2x_link_settings_requested(struct bnx2x *bp)  		bp->link_params.req_flow_ctrl[idx] = (link_config &  					 PORT_FEATURE_FLOW_CONTROL_MASK); -		if ((bp->link_params.req_flow_ctrl[idx] == -		     BNX2X_FLOW_CTRL_AUTO) && -		    !(bp->port.supported[idx] & SUPPORTED_Autoneg)) { -			bp->link_params.req_flow_ctrl[idx] = -				BNX2X_FLOW_CTRL_NONE; +		if (bp->link_params.req_flow_ctrl[idx] == +		    BNX2X_FLOW_CTRL_AUTO) { +			if (!(bp->port.supported[idx] & SUPPORTED_Autoneg)) +				bp->link_params.req_flow_ctrl[idx] = +							BNX2X_FLOW_CTRL_NONE; +			else +				bnx2x_set_requested_fc(bp);  		}  		BNX2X_DEV_INFO("req_line_speed %d  req_duplex %d req_flow_ctrl 0x%x advertising 0x%x\n", @@ -10130,7 +10355,7 @@ static void __devinit bnx2x_link_settings_requested(struct bnx2x *bp)  	}  } -static void __devinit bnx2x_set_mac_buf(u8 *mac_buf, u32 mac_lo, u16 mac_hi) +static void bnx2x_set_mac_buf(u8 *mac_buf, u32 mac_lo, u16 mac_hi)  {  	mac_hi = cpu_to_be16(mac_hi);  	mac_lo = cpu_to_be32(mac_lo); @@ -10138,7 +10363,7 @@ static void __devinit bnx2x_set_mac_buf(u8 *mac_buf, u32 mac_lo, u16 mac_hi)  	memcpy(mac_buf + sizeof(mac_hi), &mac_lo, sizeof(mac_lo));  } -static void __devinit bnx2x_get_port_hwinfo(struct bnx2x *bp) +static void bnx2x_get_port_hwinfo(struct bnx2x *bp)  {  	int port = BP_PORT(bp);  	u32 config; @@ -10199,17 +10424,6 @@ static void __devinit bnx2x_get_port_hwinfo(struct bnx2x *bp)  		bp->mdio.prtad =  			XGXS_EXT_PHY_ADDR(ext_phy_config); -	/* -	 * Check if hw lock is required to access MDC/MDIO bus to the PHY(s) -	 * In MF mode, it is set to cover self test cases -	 */ -	if (IS_MF(bp)) -		bp->port.need_hw_lock = 1; -	else -		bp->port.need_hw_lock = bnx2x_hw_lock_required(bp, -							bp->common.shmem_base, -							bp->common.shmem2_base); -  	/* Configure link feature according to nvram value */  	eee_mode = (((SHMEM_RD(bp, dev_info.  		      port_feature_config[port].eee_power_mode)) & @@ -10227,12 +10441,15 @@ static void __devinit bnx2x_get_port_hwinfo(struct bnx2x *bp)  void bnx2x_get_iscsi_info(struct bnx2x *bp)  {  	u32 no_flags = NO_ISCSI_FLAG; -#ifdef BCM_CNIC  	int port = BP_PORT(bp); -  	u32 max_iscsi_conn = FW_ENCODE_32BIT_PATTERN ^ SHMEM_RD(bp,  				drv_lic_key[port].max_iscsi_conn); +	if (!CNIC_SUPPORT(bp)) { +		bp->flags |= no_flags; +		return; +	} +  	/* Get the number of maximum allowed iSCSI connections */  	bp->cnic_eth_dev.max_iscsi_conn =  		(max_iscsi_conn & BNX2X_MAX_ISCSI_INIT_CONN_MASK) >> @@ -10247,13 +10464,10 @@ void bnx2x_get_iscsi_info(struct bnx2x *bp)  	 */  	if (!bp->cnic_eth_dev.max_iscsi_conn)  		bp->flags |= no_flags; -#else -	bp->flags |= no_flags; -#endif +  } -#ifdef BCM_CNIC -static void __devinit bnx2x_get_ext_wwn_info(struct bnx2x *bp, int func) +static void bnx2x_get_ext_wwn_info(struct bnx2x *bp, int func)  {  	/* Port info */  	bp->cnic_eth_dev.fcoe_wwn_port_name_hi = @@ -10267,16 +10481,18 @@ static void __devinit bnx2x_get_ext_wwn_info(struct bnx2x *bp, int func)  	bp->cnic_eth_dev.fcoe_wwn_node_name_lo =  		MF_CFG_RD(bp, func_ext_config[func].fcoe_wwn_node_name_lower);  } -#endif -static void __devinit bnx2x_get_fcoe_info(struct bnx2x *bp) +static void bnx2x_get_fcoe_info(struct bnx2x *bp)  { -#ifdef BCM_CNIC  	int port = BP_PORT(bp);  	int func = BP_ABS_FUNC(bp); -  	u32 max_fcoe_conn = FW_ENCODE_32BIT_PATTERN ^ SHMEM_RD(bp,  				drv_lic_key[port].max_fcoe_conn); +	if (!CNIC_SUPPORT(bp)) { +		bp->flags |= NO_FCOE_FLAG; +		return; +	} +  	/* Get the number of maximum allowed FCoE connections */  	bp->cnic_eth_dev.max_fcoe_conn =  		(max_fcoe_conn & BNX2X_MAX_FCOE_INIT_CONN_MASK) >> @@ -10311,8 +10527,9 @@ static void __devinit bnx2x_get_fcoe_info(struct bnx2x *bp)  		if (BNX2X_MF_EXT_PROTOCOL_FCOE(bp) && !CHIP_IS_E1x(bp))  			bnx2x_get_ext_wwn_info(bp, func); -	} else if (IS_MF_FCOE_SD(bp)) +	} else if (IS_MF_FCOE_SD(bp) && !CHIP_IS_E1x(bp)) {  		bnx2x_get_ext_wwn_info(bp, func); +	}  	BNX2X_DEV_INFO("max_fcoe_conn 0x%x\n", bp->cnic_eth_dev.max_fcoe_conn); @@ -10322,12 +10539,9 @@ static void __devinit bnx2x_get_fcoe_info(struct bnx2x *bp)  	 */  	if (!bp->cnic_eth_dev.max_fcoe_conn)  		bp->flags |= NO_FCOE_FLAG; -#else -	bp->flags |= NO_FCOE_FLAG; -#endif  } -static void __devinit bnx2x_get_cnic_info(struct bnx2x *bp) +static void bnx2x_get_cnic_info(struct bnx2x *bp)  {  	/*  	 * iSCSI may be dynamically disabled but reading @@ -10338,143 +10552,162 @@ static void __devinit bnx2x_get_cnic_info(struct bnx2x *bp)  	bnx2x_get_fcoe_info(bp);  } -static void __devinit bnx2x_get_mac_hwinfo(struct bnx2x *bp) +static void bnx2x_get_cnic_mac_hwinfo(struct bnx2x *bp)  {  	u32 val, val2;  	int func = BP_ABS_FUNC(bp);  	int port = BP_PORT(bp); -#ifdef BCM_CNIC  	u8 *iscsi_mac = bp->cnic_eth_dev.iscsi_mac;  	u8 *fip_mac = bp->fip_mac; -#endif -	/* Zero primary MAC configuration */ -	memset(bp->dev->dev_addr, 0, ETH_ALEN); - -	if (BP_NOMCP(bp)) { -		BNX2X_ERROR("warning: random MAC workaround active\n"); -		eth_hw_addr_random(bp->dev); -	} else if (IS_MF(bp)) { -		val2 = MF_CFG_RD(bp, func_mf_config[func].mac_upper); -		val = MF_CFG_RD(bp, func_mf_config[func].mac_lower); -		if ((val2 != FUNC_MF_CFG_UPPERMAC_DEFAULT) && -		    (val != FUNC_MF_CFG_LOWERMAC_DEFAULT)) -			bnx2x_set_mac_buf(bp->dev->dev_addr, val, val2); - -#ifdef BCM_CNIC -		/* -		 * iSCSI and FCoE NPAR MACs: if there is no either iSCSI or +	if (IS_MF(bp)) { +		/* iSCSI and FCoE NPAR MACs: if there is no either iSCSI or  		 * FCoE MAC then the appropriate feature should be disabled. -		 * -		 * In non SD mode features configuration comes from -		 * struct func_ext_config. +		 * In non SD mode features configuration comes from struct +		 * func_ext_config.  		 */ -		if (!IS_MF_SD(bp)) { +		if (!IS_MF_SD(bp) && !CHIP_IS_E1x(bp)) {  			u32 cfg = MF_CFG_RD(bp, func_ext_config[func].func_cfg);  			if (cfg & MACP_FUNC_CFG_FLAGS_ISCSI_OFFLOAD) {  				val2 = MF_CFG_RD(bp, func_ext_config[func]. -						     iscsi_mac_addr_upper); +						 iscsi_mac_addr_upper);  				val = MF_CFG_RD(bp, func_ext_config[func]. -						    iscsi_mac_addr_lower); +						iscsi_mac_addr_lower);  				bnx2x_set_mac_buf(iscsi_mac, val, val2); -				BNX2X_DEV_INFO("Read iSCSI MAC: %pM\n", -					       iscsi_mac); -			} else +				BNX2X_DEV_INFO +					("Read iSCSI MAC: %pM\n", iscsi_mac); +			} else {  				bp->flags |= NO_ISCSI_OOO_FLAG | NO_ISCSI_FLAG; +			}  			if (cfg & MACP_FUNC_CFG_FLAGS_FCOE_OFFLOAD) {  				val2 = MF_CFG_RD(bp, func_ext_config[func]. -						     fcoe_mac_addr_upper); +						 fcoe_mac_addr_upper);  				val = MF_CFG_RD(bp, func_ext_config[func]. -						    fcoe_mac_addr_lower); +						fcoe_mac_addr_lower);  				bnx2x_set_mac_buf(fip_mac, val, val2); -				BNX2X_DEV_INFO("Read FCoE L2 MAC: %pM\n", -					       fip_mac); - -			} else +				BNX2X_DEV_INFO +					("Read FCoE L2 MAC: %pM\n", fip_mac); +			} else {  				bp->flags |= NO_FCOE_FLAG; +			}  			bp->mf_ext_config = cfg;  		} else { /* SD MODE */ -			if (IS_MF_STORAGE_SD(bp)) { -				if (BNX2X_IS_MF_SD_PROTOCOL_ISCSI(bp)) { -					/* use primary mac as iscsi mac */ -					memcpy(iscsi_mac, bp->dev->dev_addr, -					       ETH_ALEN); - -					BNX2X_DEV_INFO("SD ISCSI MODE\n"); -					BNX2X_DEV_INFO("Read iSCSI MAC: %pM\n", -						       iscsi_mac); -				} else { /* FCoE */ -					memcpy(fip_mac, bp->dev->dev_addr, -					       ETH_ALEN); -					BNX2X_DEV_INFO("SD FCoE MODE\n"); -					BNX2X_DEV_INFO("Read FIP MAC: %pM\n", -						       fip_mac); -				} -				/* Zero primary MAC configuration */ -				memset(bp->dev->dev_addr, 0, ETH_ALEN); +			if (BNX2X_IS_MF_SD_PROTOCOL_ISCSI(bp)) { +				/* use primary mac as iscsi mac */ +				memcpy(iscsi_mac, bp->dev->dev_addr, ETH_ALEN); + +				BNX2X_DEV_INFO("SD ISCSI MODE\n"); +				BNX2X_DEV_INFO +					("Read iSCSI MAC: %pM\n", iscsi_mac); +			} else if (BNX2X_IS_MF_SD_PROTOCOL_FCOE(bp)) { +				/* use primary mac as fip mac */ +				memcpy(fip_mac, bp->dev->dev_addr, ETH_ALEN); +				BNX2X_DEV_INFO("SD FCoE MODE\n"); +				BNX2X_DEV_INFO +					("Read FIP MAC: %pM\n", fip_mac);  			}  		} +		if (IS_MF_STORAGE_SD(bp)) +			/* Zero primary MAC configuration */ +			memset(bp->dev->dev_addr, 0, ETH_ALEN); +  		if (IS_MF_FCOE_AFEX(bp))  			/* use FIP MAC as primary MAC */  			memcpy(bp->dev->dev_addr, fip_mac, ETH_ALEN); -#endif  	} else { -		/* in SF read MACs from port configuration */ -		val2 = SHMEM_RD(bp, dev_info.port_hw_config[port].mac_upper); -		val = SHMEM_RD(bp, dev_info.port_hw_config[port].mac_lower); -		bnx2x_set_mac_buf(bp->dev->dev_addr, val, val2); - -#ifdef BCM_CNIC  		val2 = SHMEM_RD(bp, dev_info.port_hw_config[port]. -				    iscsi_mac_upper); +				iscsi_mac_upper);  		val = SHMEM_RD(bp, dev_info.port_hw_config[port]. -				   iscsi_mac_lower); +			       iscsi_mac_lower);  		bnx2x_set_mac_buf(iscsi_mac, val, val2);  		val2 = SHMEM_RD(bp, dev_info.port_hw_config[port]. -				    fcoe_fip_mac_upper); +				fcoe_fip_mac_upper);  		val = SHMEM_RD(bp, dev_info.port_hw_config[port]. -				   fcoe_fip_mac_lower); +			       fcoe_fip_mac_lower);  		bnx2x_set_mac_buf(fip_mac, val, val2); -#endif  	} -	memcpy(bp->link_params.mac_addr, bp->dev->dev_addr, ETH_ALEN); -	memcpy(bp->dev->perm_addr, bp->dev->dev_addr, ETH_ALEN); - -#ifdef BCM_CNIC -	/* Disable iSCSI if MAC configuration is -	 * invalid. -	 */ +	/* Disable iSCSI OOO if MAC configuration is invalid. */  	if (!is_valid_ether_addr(iscsi_mac)) { -		bp->flags |= NO_ISCSI_FLAG; +		bp->flags |= NO_ISCSI_OOO_FLAG | NO_ISCSI_FLAG;  		memset(iscsi_mac, 0, ETH_ALEN);  	} -	/* Disable FCoE if MAC configuration is -	 * invalid. -	 */ +	/* Disable FCoE if MAC configuration is invalid. */  	if (!is_valid_ether_addr(fip_mac)) {  		bp->flags |= NO_FCOE_FLAG;  		memset(bp->fip_mac, 0, ETH_ALEN);  	} -#endif +} + +static void bnx2x_get_mac_hwinfo(struct bnx2x *bp) +{ +	u32 val, val2; +	int func = BP_ABS_FUNC(bp); +	int port = BP_PORT(bp); + +	/* Zero primary MAC configuration */ +	memset(bp->dev->dev_addr, 0, ETH_ALEN); + +	if (BP_NOMCP(bp)) { +		BNX2X_ERROR("warning: random MAC workaround active\n"); +		eth_hw_addr_random(bp->dev); +	} else if (IS_MF(bp)) { +		val2 = MF_CFG_RD(bp, func_mf_config[func].mac_upper); +		val = MF_CFG_RD(bp, func_mf_config[func].mac_lower); +		if ((val2 != FUNC_MF_CFG_UPPERMAC_DEFAULT) && +		    (val != FUNC_MF_CFG_LOWERMAC_DEFAULT)) +			bnx2x_set_mac_buf(bp->dev->dev_addr, val, val2); + +		if (CNIC_SUPPORT(bp)) +			bnx2x_get_cnic_mac_hwinfo(bp); +	} else { +		/* in SF read MACs from port configuration */ +		val2 = SHMEM_RD(bp, dev_info.port_hw_config[port].mac_upper); +		val = SHMEM_RD(bp, dev_info.port_hw_config[port].mac_lower); +		bnx2x_set_mac_buf(bp->dev->dev_addr, val, val2); + +		if (CNIC_SUPPORT(bp)) +			bnx2x_get_cnic_mac_hwinfo(bp); +	} + +	memcpy(bp->link_params.mac_addr, bp->dev->dev_addr, ETH_ALEN); +	memcpy(bp->dev->perm_addr, bp->dev->dev_addr, ETH_ALEN);  	if (!bnx2x_is_valid_ether_addr(bp, bp->dev->dev_addr))  		dev_err(&bp->pdev->dev,  			"bad Ethernet MAC address configuration: %pM\n"  			"change it manually before bringing up the appropriate network interface\n",  			bp->dev->dev_addr); +} +static bool bnx2x_get_dropless_info(struct bnx2x *bp) +{ +	int tmp; +	u32 cfg; +	if (IS_MF(bp) && !CHIP_IS_E1x(bp)) { +		/* Take function: tmp = func */ +		tmp = BP_ABS_FUNC(bp); +		cfg = MF_CFG_RD(bp, func_ext_config[tmp].func_cfg); +		cfg = !!(cfg & MACP_FUNC_CFG_PAUSE_ON_HOST_RING); +	} else { +		/* Take port: tmp = port */ +		tmp = BP_PORT(bp); +		cfg = SHMEM_RD(bp, +			       dev_info.port_hw_config[tmp].generic_features); +		cfg = !!(cfg & PORT_HW_CFG_PAUSE_ON_HOST_RING_ENABLED); +	} +	return cfg;  } -static int __devinit bnx2x_get_hwinfo(struct bnx2x *bp) +static int bnx2x_get_hwinfo(struct bnx2x *bp)  {  	int /*abs*/func = BP_ABS_FUNC(bp);  	int vn; @@ -10516,6 +10749,8 @@ static int __devinit bnx2x_get_hwinfo(struct bnx2x *bp)  			if (REG_RD(bp, IGU_REG_RESET_MEMORIES)) {  				dev_err(&bp->pdev->dev,  					"FORCING Normal Mode failed!!!\n"); +				bnx2x_release_hw_lock(bp, +						      HW_LOCK_RESOURCE_RESET);  				return -EPERM;  			}  		} @@ -10526,9 +10761,10 @@ static int __devinit bnx2x_get_hwinfo(struct bnx2x *bp)  		} else  			BNX2X_DEV_INFO("IGU Normal Mode\n"); -		bnx2x_get_igu_cam_info(bp); - +		rc = bnx2x_get_igu_cam_info(bp);  		bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_RESET); +		if (rc) +			return rc;  	}  	/* @@ -10697,7 +10933,7 @@ static int __devinit bnx2x_get_hwinfo(struct bnx2x *bp)  	return rc;  } -static void __devinit bnx2x_read_fwinfo(struct bnx2x *bp) +static void bnx2x_read_fwinfo(struct bnx2x *bp)  {  	int cnt, i, block_end, rodi;  	char vpd_start[BNX2X_VPD_LEN+1]; @@ -10782,7 +11018,7 @@ out_not_found:  	return;  } -static void __devinit bnx2x_set_modes_bitmap(struct bnx2x *bp) +static void bnx2x_set_modes_bitmap(struct bnx2x *bp)  {  	u32 flags = 0; @@ -10832,7 +11068,7 @@ static void __devinit bnx2x_set_modes_bitmap(struct bnx2x *bp)  	INIT_MODE_FLAGS(bp) = flags;  } -static int __devinit bnx2x_init_bp(struct bnx2x *bp) +static int bnx2x_init_bp(struct bnx2x *bp)  {  	int func;  	int rc; @@ -10840,9 +11076,7 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)  	mutex_init(&bp->port.phy_mutex);  	mutex_init(&bp->fw_mb_mutex);  	spin_lock_init(&bp->stats_lock); -#ifdef BCM_CNIC -	mutex_init(&bp->cnic_mutex); -#endif +  	INIT_DELAYED_WORK(&bp->sp_task, bnx2x_sp_task);  	INIT_DELAYED_WORK(&bp->sp_rtnl_task, bnx2x_sp_rtnl_task); @@ -10880,10 +11114,7 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)  		dev_err(&bp->pdev->dev, "MCP disabled, must load devices in order!\n");  	bp->disable_tpa = disable_tpa; - -#ifdef BCM_CNIC  	bp->disable_tpa |= IS_MF_STORAGE_SD(bp) || IS_MF_FCOE_AFEX(bp); -#endif  	/* Set TPA flags */  	if (bp->disable_tpa) { @@ -10897,7 +11128,7 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)  	if (CHIP_IS_E1(bp))  		bp->dropless_fc = 0;  	else -		bp->dropless_fc = dropless_fc; +		bp->dropless_fc = dropless_fc | bnx2x_get_dropless_info(bp);  	bp->mrrs = mrrs; @@ -10914,15 +11145,20 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)  	bp->timer.data = (unsigned long) bp;  	bp->timer.function = bnx2x_timer; -	bnx2x_dcbx_set_state(bp, true, BNX2X_DCBX_ENABLED_ON_NEG_ON); -	bnx2x_dcbx_init_params(bp); +	if (SHMEM2_HAS(bp, dcbx_lldp_params_offset) && +	    SHMEM2_HAS(bp, dcbx_lldp_dcbx_stat_offset) && +	    SHMEM2_RD(bp, dcbx_lldp_params_offset) && +	    SHMEM2_RD(bp, dcbx_lldp_dcbx_stat_offset)) { +		bnx2x_dcbx_set_state(bp, true, BNX2X_DCBX_ENABLED_ON_NEG_ON); +		bnx2x_dcbx_init_params(bp); +	} else { +		bnx2x_dcbx_set_state(bp, false, BNX2X_DCBX_ENABLED_OFF); +	} -#ifdef BCM_CNIC  	if (CHIP_IS_E1x(bp))  		bp->cnic_base_cl_id = FP_SB_MAX_E1x;  	else  		bp->cnic_base_cl_id = FP_SB_MAX_E2; -#endif  	/* multiple tx priority */  	if (CHIP_IS_E1x(bp)) @@ -10932,6 +11168,16 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)  	if (CHIP_IS_E3B0(bp))  		bp->max_cos = BNX2X_MULTI_TX_COS_E3B0; +	/* We need at least one default status block for slow-path events, +	 * second status block for the L2 queue, and a third status block for +	 * CNIC if supproted. +	 */ +	if (CNIC_SUPPORT(bp)) +		bp->min_msix_vec_cnt = 3; +	else +		bp->min_msix_vec_cnt = 2; +	BNX2X_DEV_INFO("bp->min_msix_vec_cnt %d", bp->min_msix_vec_cnt); +  	return rc;  } @@ -11168,11 +11414,9 @@ void bnx2x_set_rx_mode(struct net_device *dev)  	}  	bp->rx_mode = rx_mode; -#ifdef BCM_CNIC  	/* handle ISCSI SD mode */  	if (IS_MF_ISCSI_SD(bp))  		bp->rx_mode = BNX2X_RX_MODE_NONE; -#endif  	/* Schedule the rx_mode command */  	if (test_bit(BNX2X_FILTER_RX_MODE_PENDING, &bp->sp_state)) { @@ -11284,7 +11528,7 @@ static const struct net_device_ops bnx2x_netdev_ops = {  #endif  	.ndo_setup_tc		= bnx2x_setup_tc, -#if defined(NETDEV_FCOE_WWNN) && defined(BCM_CNIC) +#ifdef NETDEV_FCOE_WWNN  	.ndo_fcoe_get_wwn	= bnx2x_fcoe_get_wwn,  #endif  }; @@ -11307,9 +11551,8 @@ static int bnx2x_set_coherency_mask(struct bnx2x *bp)  	return 0;  } -static int __devinit bnx2x_init_dev(struct pci_dev *pdev, -				    struct net_device *dev, -				    unsigned long board_type) +static int bnx2x_init_dev(struct pci_dev *pdev, struct net_device *dev, +			  unsigned long board_type)  {  	struct bnx2x *bp;  	int rc; @@ -11346,6 +11589,14 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,  		goto err_out_disable;  	} +	pci_read_config_dword(pdev, PCICFG_REVISION_ID_OFFSET, &pci_cfg_dword); +	if ((pci_cfg_dword & PCICFG_REVESION_ID_MASK) == +	    PCICFG_REVESION_ID_ERROR_VAL) { +		pr_err("PCI device error, probably due to fan failure, aborting\n"); +		rc = -ENODEV; +		goto err_out_disable; +	} +  	if (atomic_read(&pdev->enable_cnt) == 1) {  		rc = pci_request_regions(pdev, DRV_MODULE_NAME);  		if (rc) { @@ -11481,8 +11732,7 @@ err_out:  	return rc;  } -static void __devinit bnx2x_get_pcie_width_speed(struct bnx2x *bp, -						 int *width, int *speed) +static void bnx2x_get_pcie_width_speed(struct bnx2x *bp, int *width, int *speed)  {  	u32 val = REG_RD(bp, PCICFG_OFFSET + PCICFG_LINK_CONTROL); @@ -11750,9 +12000,8 @@ static int bnx2x_set_qm_cid_count(struct bnx2x *bp)  {  	int cid_count = BNX2X_L2_MAX_CID(bp); -#ifdef BCM_CNIC -	cid_count += CNIC_CID_MAX; -#endif +	if (CNIC_SUPPORT(bp)) +		cid_count += CNIC_CID_MAX;  	return roundup(cid_count, QM_CID_ROUND);  } @@ -11762,7 +12011,8 @@ static int bnx2x_set_qm_cid_count(struct bnx2x *bp)   * @dev:	pci device   *   */ -static int bnx2x_get_num_non_def_sbs(struct pci_dev *pdev) +static int bnx2x_get_num_non_def_sbs(struct pci_dev *pdev, +				     int cnic_cnt)  {  	int pos;  	u16 control; @@ -11774,7 +12024,7 @@ static int bnx2x_get_num_non_def_sbs(struct pci_dev *pdev)  	 * one fast path queue: one FP queue + SB for CNIC  	 */  	if (!pos) -		return 1 + CNIC_PRESENT; +		return 1 + cnic_cnt;  	/*  	 * The value in the PCI configuration space is the index of the last @@ -11786,14 +12036,16 @@ static int bnx2x_get_num_non_def_sbs(struct pci_dev *pdev)  	return control & PCI_MSIX_FLAGS_QSIZE;  } -static int __devinit bnx2x_init_one(struct pci_dev *pdev, -				    const struct pci_device_id *ent) +struct cnic_eth_dev *bnx2x_cnic_probe(struct net_device *); + +static int bnx2x_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  {  	struct net_device *dev = NULL;  	struct bnx2x *bp;  	int pcie_width, pcie_speed;  	int rc, max_non_def_sbs;  	int rx_count, tx_count, rss_count, doorbell_size; +	int cnic_cnt;  	/*  	 * An estimated maximum supported CoS number according to the chip  	 * version. @@ -11837,21 +12089,22 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev,  		return -ENODEV;  	} -	max_non_def_sbs = bnx2x_get_num_non_def_sbs(pdev); +	cnic_cnt = 1; +	max_non_def_sbs = bnx2x_get_num_non_def_sbs(pdev, cnic_cnt);  	WARN_ON(!max_non_def_sbs);  	/* Maximum number of RSS queues: one IGU SB goes to CNIC */ -	rss_count = max_non_def_sbs - CNIC_PRESENT; +	rss_count = max_non_def_sbs - cnic_cnt;  	/* Maximum number of netdev Rx queues: RSS + FCoE L2 */ -	rx_count = rss_count + FCOE_PRESENT; +	rx_count = rss_count + cnic_cnt;  	/*  	 * Maximum number of netdev Tx queues:  	 * Maximum TSS queues * Maximum supported number of CoS  + FCoE L2  	 */ -	tx_count = rss_count * max_cos_est + FCOE_PRESENT; +	tx_count = rss_count * max_cos_est + cnic_cnt;  	/* dev zeroed in init_etherdev */  	dev = alloc_etherdev_mqs(sizeof(*bp), tx_count, rx_count); @@ -11862,6 +12115,9 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev,  	bp->igu_sb_cnt = max_non_def_sbs;  	bp->msg_enable = debug; +	bp->cnic_support = cnic_cnt; +	bp->cnic_probe = bnx2x_cnic_probe; +  	pci_set_drvdata(pdev, dev);  	rc = bnx2x_init_dev(pdev, dev, ent->driver_data); @@ -11870,6 +12126,7 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev,  		return rc;  	} +	BNX2X_DEV_INFO("Cnic support is %s\n", CNIC_SUPPORT(bp) ? "on" : "off");  	BNX2X_DEV_INFO("max_non_def_sbs %d\n", max_non_def_sbs);  	BNX2X_DEV_INFO("Allocated netdev with %d tx and %d rx queues\n", @@ -11902,10 +12159,10 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev,  	/* calc qm_cid_count */  	bp->qm_cid_count = bnx2x_set_qm_cid_count(bp); -#ifdef BCM_CNIC -	/* disable FCOE L2 queue for E1x */ +	/* disable FCOE L2 queue for E1x*/  	if (CHIP_IS_E1x(bp))  		bp->flags |= NO_FCOE_FLAG; +  	/* disable FCOE for 57840 device, until FW supports it */  	switch (ent->driver_data) {  	case BCM57840_O: @@ -11915,8 +12172,6 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev,  	case BCM57840_MF:  		bp->flags |= NO_FCOE_FLAG;  	} -#endif -  	/* Set bp->num_queues for MSI-X mode*/  	bnx2x_set_num_queues(bp); @@ -11932,14 +12187,13 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev,  		goto init_one_exit;  	} -#ifdef BCM_CNIC +  	if (!NO_FCOE(bp)) {  		/* Add storage MAC address */  		rtnl_lock();  		dev_addr_add(bp->dev, bp->fip_mac, NETDEV_HW_ADDR_T_SAN);  		rtnl_unlock();  	} -#endif  	bnx2x_get_pcie_width_speed(bp, &pcie_width, &pcie_speed); @@ -11973,7 +12227,7 @@ init_one_exit:  	return rc;  } -static void __devexit bnx2x_remove_one(struct pci_dev *pdev) +static void bnx2x_remove_one(struct pci_dev *pdev)  {  	struct net_device *dev = pci_get_drvdata(pdev);  	struct bnx2x *bp; @@ -11984,14 +12238,12 @@ static void __devexit bnx2x_remove_one(struct pci_dev *pdev)  	}  	bp = netdev_priv(dev); -#ifdef BCM_CNIC  	/* Delete storage MAC address */  	if (!NO_FCOE(bp)) {  		rtnl_lock();  		dev_addr_del(bp->dev, bp->fip_mac, NETDEV_HW_ADDR_T_SAN);  		rtnl_unlock();  	} -#endif  #ifdef BCM_DCBNL  	/* Delete app tlvs from dcbnl */ @@ -12039,15 +12291,17 @@ static int bnx2x_eeh_nic_unload(struct bnx2x *bp)  	bp->rx_mode = BNX2X_RX_MODE_NONE; -#ifdef BCM_CNIC -	bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD); -#endif +	if (CNIC_LOADED(bp)) +		bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD); +  	/* Stop Tx */  	bnx2x_tx_disable(bp);  	bnx2x_netif_stop(bp, 0);  	/* Delete all NAPI objects */  	bnx2x_del_all_napi(bp); +	if (CNIC_LOADED(bp)) +		bnx2x_del_all_napi_cnic(bp);  	del_timer_sync(&bp->timer); @@ -12188,7 +12442,7 @@ static struct pci_driver bnx2x_pci_driver = {  	.name        = DRV_MODULE_NAME,  	.id_table    = bnx2x_pci_tbl,  	.probe       = bnx2x_init_one, -	.remove      = __devexit_p(bnx2x_remove_one), +	.remove      = bnx2x_remove_one,  	.suspend     = bnx2x_suspend,  	.resume      = bnx2x_resume,  	.err_handler = &bnx2x_err_handler, @@ -12238,7 +12492,6 @@ void bnx2x_notify_link_changed(struct bnx2x *bp)  module_init(bnx2x_init);  module_exit(bnx2x_cleanup); -#ifdef BCM_CNIC  /**   * bnx2x_set_iscsi_eth_mac_addr - set iSCSI MAC(s).   * @@ -12691,12 +12944,31 @@ static int bnx2x_register_cnic(struct net_device *dev, struct cnic_ops *ops,  {  	struct bnx2x *bp = netdev_priv(dev);  	struct cnic_eth_dev *cp = &bp->cnic_eth_dev; +	int rc; + +	DP(NETIF_MSG_IFUP, "Register_cnic called\n");  	if (ops == NULL) {  		BNX2X_ERR("NULL ops received\n");  		return -EINVAL;  	} +	if (!CNIC_SUPPORT(bp)) { +		BNX2X_ERR("Can't register CNIC when not supported\n"); +		return -EOPNOTSUPP; +	} + +	if (!CNIC_LOADED(bp)) { +		rc = bnx2x_load_cnic(bp); +		if (rc) { +			BNX2X_ERR("CNIC-related load failed\n"); +			return rc; +		} + +	} + +	bp->cnic_enabled = true; +  	bp->cnic_kwq = kzalloc(PAGE_SIZE, GFP_KERNEL);  	if (!bp->cnic_kwq)  		return -ENOMEM; @@ -12786,7 +13058,5 @@ struct cnic_eth_dev *bnx2x_cnic_probe(struct net_device *dev)  	   cp->starting_cid);  	return cp;  } -EXPORT_SYMBOL(bnx2x_cnic_probe); -#endif /* BCM_CNIC */ diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h index 1b1999d34c71..bc2f65b32649 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h @@ -2107,6 +2107,7 @@  #define NIG_REG_LLH1_ERROR_MASK 				 0x10090  /* [RW 8] event id for llh1 */  #define NIG_REG_LLH1_EVENT_ID					 0x10088 +#define NIG_REG_LLH1_FUNC_EN					 0x16104  #define NIG_REG_LLH1_FUNC_MEM					 0x161c0  #define NIG_REG_LLH1_FUNC_MEM_ENABLE				 0x16160  #define NIG_REG_LLH1_FUNC_MEM_SIZE				 16 @@ -2302,6 +2303,15 @@   * set to 0x345678021. This is a new register (with 2_) added in E3 B0 to   * accommodate the 9 input clients to ETS arbiter. */  #define NIG_REG_P0_TX_ARB_PRIORITY_CLIENT2_MSB			 0x18684 +/* [RW 1] MCP-to-host path enable. Set this bit to enable the routing of MCP + * packets to BRB LB interface to forward the packet to the host. All + * packets from MCP are forwarded to the network when this bit is cleared - + * regardless of the configured destination in tx_mng_destination register. + * When MCP-to-host paths for both ports 0 and 1 are disabled - the arbiter + * for BRB LB interface is bypassed and PBF LB traffic is always selected to + * send to BRB LB. + */ +#define NIG_REG_P0_TX_MNG_HOST_ENABLE				 0x182f4  #define NIG_REG_P1_HWPFC_ENABLE					 0x181d0  #define NIG_REG_P1_MAC_IN_EN					 0x185c0  /* [RW 1] Output enable for TX MAC interface */ @@ -2418,6 +2428,12 @@  #define NIG_REG_P1_TX_ARB_PRIORITY_CLIENT2_MSB			 0x186e4  /* [R 1] TX FIFO for transmitting data to MAC is empty. */  #define NIG_REG_P1_TX_MACFIFO_EMPTY				 0x18594 +/* [RW 1] MCP-to-host path enable. Set this bit to enable the routing of MCP + * packets to BRB LB interface to forward the packet to the host. All + * packets from MCP are forwarded to the network when this bit is cleared - + * regardless of the configured destination in tx_mng_destination register. + */ +#define NIG_REG_P1_TX_MNG_HOST_ENABLE				 0x182f8  /* [R 1] FIFO empty status of the MCP TX FIFO used for storing MCP packets     forwarded to the host. */  #define NIG_REG_P1_TX_MNG_HOST_FIFO_EMPTY			 0x182b8 @@ -5482,6 +5498,7 @@  #define XMAC_CTRL_REG_RX_EN					 (0x1<<1)  #define XMAC_CTRL_REG_SOFT_RESET				 (0x1<<6)  #define XMAC_CTRL_REG_TX_EN					 (0x1<<0) +#define XMAC_CTRL_REG_XLGMII_ALIGN_ENB				 (0x1<<7)  #define XMAC_PAUSE_CTRL_REG_RX_PAUSE_EN				 (0x1<<18)  #define XMAC_PAUSE_CTRL_REG_TX_PAUSE_EN				 (0x1<<17)  #define XMAC_PFC_CTRL_HI_REG_FORCE_PFC_XON			 (0x1<<1) @@ -5502,11 +5519,14 @@  #define XMAC_REG_PAUSE_CTRL					 0x68  #define XMAC_REG_PFC_CTRL					 0x70  #define XMAC_REG_PFC_CTRL_HI					 0x74 +#define XMAC_REG_RX_LSS_CTRL					 0x50  #define XMAC_REG_RX_LSS_STATUS					 0x58  /* [RW 14] Maximum packet size in receive direction; exclusive of preamble &   * CRC in strip mode */  #define XMAC_REG_RX_MAX_SIZE					 0x40  #define XMAC_REG_TX_CTRL					 0x20 +#define XMAC_RX_LSS_CTRL_REG_LOCAL_FAULT_DISABLE		 (0x1<<0) +#define XMAC_RX_LSS_CTRL_REG_REMOTE_FAULT_DISABLE		 (0x1<<1)  /* [RW 16] Indirect access to the XX table of the XX protection mechanism.     The fields are:[4:0] - tail pointer; 9:5] - Link List size; 14:10] -     header pointer. */ @@ -5922,6 +5942,16 @@  #define MISC_REGISTERS_SPIO_OUTPUT_HIGH 			 1  #define MISC_REGISTERS_SPIO_OUTPUT_LOW				 0  #define MISC_REGISTERS_SPIO_SET_POS				 8 +#define MISC_SPIO_CLR_POS					 16 +#define MISC_SPIO_FLOAT					 (0xffL<<24) +#define MISC_SPIO_FLOAT_POS					 24 +#define MISC_SPIO_INPUT_HI_Z					 2 +#define MISC_SPIO_INT_OLD_SET_POS				 16 +#define MISC_SPIO_OUTPUT_HIGH					 1 +#define MISC_SPIO_OUTPUT_LOW					 0 +#define MISC_SPIO_SET_POS					 8 +#define MISC_SPIO_SPIO4					 0x10 +#define MISC_SPIO_SPIO5					 0x20  #define HW_LOCK_MAX_RESOURCE_VALUE				 31  #define HW_LOCK_RESOURCE_DCBX_ADMIN_MIB				 13  #define HW_LOCK_RESOURCE_DRV_FLAGS				 10 @@ -6130,7 +6160,9 @@  #define PCICFG_COMMAND_INT_DISABLE		(1<<10)  #define PCICFG_COMMAND_RESERVED 		(0x1f<<11)  #define PCICFG_STATUS_OFFSET				0x06 -#define PCICFG_REVESION_ID_OFFSET			0x08 +#define PCICFG_REVISION_ID_OFFSET			0x08 +#define PCICFG_REVESION_ID_MASK			0xff +#define PCICFG_REVESION_ID_ERROR_VAL		0xff  #define PCICFG_CACHE_LINE_SIZE				0x0c  #define PCICFG_LATENCY_TIMER				0x0d  #define PCICFG_BAR_1_LOW				0x10 @@ -6672,6 +6704,7 @@  #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_XFI	0x1B00  #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_20G_DXGXS	0x1E00  #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_SFI	0x1F00 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_20G_KR2	0x3900  #define MDIO_REG_BANK_10G_PARALLEL_DETECT		0x8130 @@ -7046,7 +7079,8 @@ Theotherbitsarereservedandshouldbezero*/  #define MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT2	0x12  #define MDIO_WC_REG_AN_IEEE1BLK_AN_ADV2_FEC_ABILITY	0x4000  #define MDIO_WC_REG_AN_IEEE1BLK_AN_ADV2_FEC_REQ		0x8000 -#define MDIO_WC_REG_PMD_IEEE9BLK_TENGBASE_KR_PMD_CONTROL_REGISTER_150  0x96 +#define MDIO_WC_REG_PCS_STATUS2				0x0021 +#define MDIO_WC_REG_PMD_KR_CONTROL			0x0096  #define MDIO_WC_REG_XGXSBLK0_XGXSCONTROL		0x8000  #define MDIO_WC_REG_XGXSBLK0_MISCCONTROL1		0x800e  #define MDIO_WC_REG_XGXSBLK1_DESKEW			0x8010 @@ -7078,6 +7112,7 @@ Theotherbitsarereservedandshouldbezero*/  #define MDIO_WC_REG_PAR_DET_10G_STATUS			0x8130  #define MDIO_WC_REG_PAR_DET_10G_CTRL			0x8131  #define MDIO_WC_REG_XGXS_X2_CONTROL2			0x8141 +#define MDIO_WC_REG_XGXS_X2_CONTROL3			0x8142  #define MDIO_WC_REG_XGXS_RX_LN_SWAP1			0x816B  #define MDIO_WC_REG_XGXS_TX_LN_SWAP1			0x8169  #define MDIO_WC_REG_GP2_STATUS_GP_2_0			0x81d0 @@ -7112,6 +7147,7 @@ Theotherbitsarereservedandshouldbezero*/  #define MDIO_WC_REG_TX_FIR_TAP_POST_TAP_OFFSET		0x0a  #define MDIO_WC_REG_TX_FIR_TAP_POST_TAP_MASK		0x7c00  #define MDIO_WC_REG_TX_FIR_TAP_ENABLE		0x8000 +#define MDIO_WC_REG_CL72_USERB0_CL72_TX_FIR_TAP		0x82e2  #define MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL	0x82e3  #define MDIO_WC_REG_CL72_USERB0_CL72_OS_DEF_CTRL	0x82e6  #define MDIO_WC_REG_CL72_USERB0_CL72_BR_DEF_CTRL	0x82e7 @@ -7129,9 +7165,16 @@ Theotherbitsarereservedandshouldbezero*/  #define MDIO_WC_REG_DIGITAL4_MISC5			0x833e  #define MDIO_WC_REG_DIGITAL5_MISC6			0x8345  #define MDIO_WC_REG_DIGITAL5_MISC7			0x8349 +#define MDIO_WC_REG_DIGITAL5_LINK_STATUS		0x834d  #define MDIO_WC_REG_DIGITAL5_ACTUAL_SPEED		0x834e  #define MDIO_WC_REG_DIGITAL6_MP5_NEXTPAGECTRL		0x8350  #define MDIO_WC_REG_CL49_USERB0_CTRL			0x8368 +#define MDIO_WC_REG_CL73_USERB0_CTRL			0x8370 +#define MDIO_WC_REG_CL73_USERB0_USTAT			0x8371 +#define MDIO_WC_REG_CL73_BAM_CTRL1			0x8372 +#define MDIO_WC_REG_CL73_BAM_CTRL2			0x8373 +#define MDIO_WC_REG_CL73_BAM_CTRL3			0x8374 +#define MDIO_WC_REG_CL73_BAM_CODE_FIELD			0x837b  #define MDIO_WC_REG_EEE_COMBO_CONTROL0			0x8390  #define MDIO_WC_REG_TX66_CONTROL			0x83b0  #define MDIO_WC_REG_RX66_CONTROL			0x83c0 @@ -7145,7 +7188,17 @@ Theotherbitsarereservedandshouldbezero*/  #define MDIO_WC_REG_RX66_SCW3_MASK			0x83c9  #define MDIO_WC_REG_FX100_CTRL1				0x8400  #define MDIO_WC_REG_FX100_CTRL3				0x8402 - +#define MDIO_WC_REG_CL82_USERB1_TX_CTRL5		0x8436 +#define MDIO_WC_REG_CL82_USERB1_TX_CTRL6		0x8437 +#define MDIO_WC_REG_CL82_USERB1_TX_CTRL7		0x8438 +#define MDIO_WC_REG_CL82_USERB1_TX_CTRL9		0x8439 +#define MDIO_WC_REG_CL82_USERB1_RX_CTRL10		0x843a +#define MDIO_WC_REG_CL82_USERB1_RX_CTRL11		0x843b +#define MDIO_WC_REG_ETA_CL73_OUI1			0x8453 +#define MDIO_WC_REG_ETA_CL73_OUI2			0x8454 +#define MDIO_WC_REG_ETA_CL73_OUI3			0x8455 +#define MDIO_WC_REG_ETA_CL73_LD_BAM_CODE		0x8456 +#define MDIO_WC_REG_ETA_CL73_LD_UD_CODE			0x8457  #define MDIO_WC_REG_MICROBLK_CMD			0xffc2  #define MDIO_WC_REG_MICROBLK_DL_STATUS			0xffc5  #define MDIO_WC_REG_MICROBLK_CMD3			0xffcc diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c index 614981c02264..09b625e0fdaa 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c @@ -4318,7 +4318,7 @@ static int bnx2x_queue_comp_cmd(struct bnx2x *bp,  	if (o->next_tx_only >= o->max_cos)  		/* >= becuase tx only must always be smaller than cos since the -		 * primary connection suports COS 0 +		 * primary connection supports COS 0  		 */  		BNX2X_ERR("illegal value for next tx_only: %d. max cos was %d",  			   o->next_tx_only, o->max_cos); @@ -5350,12 +5350,24 @@ static int bnx2x_func_chk_transition(struct bnx2x *bp,  		else if ((cmd == BNX2X_F_CMD_AFEX_VIFLISTS) &&  			 (!test_bit(BNX2X_F_CMD_STOP, &o->pending)))  			next_state = BNX2X_F_STATE_STARTED; + +		/* Switch_update ramrod can be sent in either started or +		 * tx_stopped state, and it doesn't change the state. +		 */ +		else if ((cmd == BNX2X_F_CMD_SWITCH_UPDATE) && +			 (!test_bit(BNX2X_F_CMD_STOP, &o->pending))) +			next_state = BNX2X_F_STATE_STARTED; +  		else if (cmd == BNX2X_F_CMD_TX_STOP)  			next_state = BNX2X_F_STATE_TX_STOPPED;  		break;  	case BNX2X_F_STATE_TX_STOPPED: -		if (cmd == BNX2X_F_CMD_TX_START) +		if ((cmd == BNX2X_F_CMD_SWITCH_UPDATE) && +		    (!test_bit(BNX2X_F_CMD_STOP, &o->pending))) +			next_state = BNX2X_F_STATE_TX_STOPPED; + +		else if (cmd == BNX2X_F_CMD_TX_START)  			next_state = BNX2X_F_STATE_STARTED;  		break; @@ -5637,6 +5649,28 @@ static inline int bnx2x_func_send_start(struct bnx2x *bp,  			     U64_LO(data_mapping), NONE_CONNECTION_TYPE);  } +static inline int bnx2x_func_send_switch_update(struct bnx2x *bp, +					struct bnx2x_func_state_params *params) +{ +	struct bnx2x_func_sp_obj *o = params->f_obj; +	struct function_update_data *rdata = +		(struct function_update_data *)o->rdata; +	dma_addr_t data_mapping = o->rdata_mapping; +	struct bnx2x_func_switch_update_params *switch_update_params = +		¶ms->params.switch_update; + +	memset(rdata, 0, sizeof(*rdata)); + +	/* Fill the ramrod data with provided parameters */ +	rdata->tx_switch_suspend_change_flg = 1; +	rdata->tx_switch_suspend = switch_update_params->suspend; +	rdata->echo = SWITCH_UPDATE; + +	return bnx2x_sp_post(bp, RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE, 0, +			     U64_HI(data_mapping), +			     U64_LO(data_mapping), NONE_CONNECTION_TYPE); +} +  static inline int bnx2x_func_send_afex_update(struct bnx2x *bp,  					 struct bnx2x_func_state_params *params)  { @@ -5657,6 +5691,7 @@ static inline int bnx2x_func_send_afex_update(struct bnx2x *bp,  		cpu_to_le16(afex_update_params->afex_default_vlan);  	rdata->allowed_priorities_change_flg = 1;  	rdata->allowed_priorities = afex_update_params->allowed_priorities; +	rdata->echo = AFEX_UPDATE;  	/*  No need for an explicit memory barrier here as long we would  	 *  need to ensure the ordering of writing to the SPQ element @@ -5773,6 +5808,8 @@ static int bnx2x_func_send_cmd(struct bnx2x *bp,  		return bnx2x_func_send_tx_stop(bp, params);  	case BNX2X_F_CMD_TX_START:  		return bnx2x_func_send_tx_start(bp, params); +	case BNX2X_F_CMD_SWITCH_UPDATE: +		return bnx2x_func_send_switch_update(bp, params);  	default:  		BNX2X_ERR("Unknown command: %d\n", params->cmd);  		return -EINVAL; @@ -5818,16 +5855,30 @@ int bnx2x_func_state_change(struct bnx2x *bp,  			    struct bnx2x_func_state_params *params)  {  	struct bnx2x_func_sp_obj *o = params->f_obj; -	int rc; +	int rc, cnt = 300;  	enum bnx2x_func_cmd cmd = params->cmd;  	unsigned long *pending = &o->pending;  	mutex_lock(&o->one_pending_mutex);  	/* Check that the requested transition is legal */ -	if (o->check_transition(bp, o, params)) { +	rc = o->check_transition(bp, o, params); +	if ((rc == -EBUSY) && +	    (test_bit(RAMROD_RETRY, ¶ms->ramrod_flags))) { +		while ((rc == -EBUSY) && (--cnt > 0)) { +			mutex_unlock(&o->one_pending_mutex); +			msleep(10); +			mutex_lock(&o->one_pending_mutex); +			rc = o->check_transition(bp, o, params); +		} +		if (rc == -EBUSY) { +			mutex_unlock(&o->one_pending_mutex); +			BNX2X_ERR("timeout waiting for previous ramrod completion\n"); +			return rc; +		} +	} else if (rc) {  		mutex_unlock(&o->one_pending_mutex); -		return -EINVAL; +		return rc;  	}  	/* Set "pending" bit */ diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h index acf2fe4ca608..adbd91b1bdfc 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h @@ -40,6 +40,12 @@ enum {  	 * pending commands list.  	 */  	RAMROD_CONT, +	/* If there is another pending ramrod, wait until it finishes and +	 * re-try to submit this one. This flag can be set only in sleepable +	 * context, and should not be set from the context that completes the +	 * ramrods as deadlock will occur. +	 */ +	RAMROD_RETRY,  };  typedef enum { @@ -1061,6 +1067,7 @@ enum bnx2x_func_cmd {  	BNX2X_F_CMD_AFEX_VIFLISTS,  	BNX2X_F_CMD_TX_STOP,  	BNX2X_F_CMD_TX_START, +	BNX2X_F_CMD_SWITCH_UPDATE,  	BNX2X_F_CMD_MAX,  }; @@ -1103,6 +1110,10 @@ struct bnx2x_func_start_params {  	u8 network_cos_mode;  }; +struct bnx2x_func_switch_update_params { +	u8 suspend; +}; +  struct bnx2x_func_afex_update_params {  	u16 vif_id;  	u16 afex_default_vlan; @@ -1136,6 +1147,7 @@ struct bnx2x_func_state_params {  		struct bnx2x_func_hw_init_params hw_init;  		struct bnx2x_func_hw_reset_params hw_reset;  		struct bnx2x_func_start_params start; +		struct bnx2x_func_switch_update_params switch_update;  		struct bnx2x_func_afex_update_params afex_update;  		struct bnx2x_func_afex_viflists_params afex_viflists;  		struct bnx2x_func_tx_start_params tx_start; diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c index 348ed02d3c69..89ec0667140a 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c @@ -1149,6 +1149,7 @@ static void bnx2x_drv_stats_update(struct bnx2x *bp)  		UPDATE_ESTAT_QSTAT(rx_err_discard_pkt);  		UPDATE_ESTAT_QSTAT(rx_skb_alloc_failed);  		UPDATE_ESTAT_QSTAT(hw_csum_err); +		UPDATE_ESTAT_QSTAT(driver_filtered_tx_pkt);  	}  } diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h index 24b8e505b60c..b4d7b26c7fe7 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h @@ -203,6 +203,7 @@ struct bnx2x_eth_stats {  	/* Recovery */  	u32 recoverable_error;  	u32 unrecoverable_error; +	u32 driver_filtered_tx_pkt;  	/* src: Clear-on-Read register; Will not survive PMF Migration */  	u32 eee_tx_lpi;  }; @@ -264,6 +265,7 @@ struct bnx2x_eth_q_stats {  	u32 total_tpa_aggregated_frames_lo;  	u32 total_tpa_bytes_hi;  	u32 total_tpa_bytes_lo; +	u32 driver_filtered_tx_pkt;  };  struct bnx2x_eth_stats_old { @@ -315,6 +317,7 @@ struct bnx2x_eth_q_stats_old {  	u32 rx_err_discard_pkt_old;  	u32 rx_skb_alloc_failed_old;  	u32 hw_csum_err_old; +	u32 driver_filtered_tx_pkt_old;  };  struct bnx2x_net_stats_old { diff --git a/drivers/net/ethernet/broadcom/cnic.c b/drivers/net/ethernet/broadcom/cnic.c index cc8434fd606e..df8c30d1a52c 100644 --- a/drivers/net/ethernet/broadcom/cnic.c +++ b/drivers/net/ethernet/broadcom/cnic.c @@ -40,8 +40,10 @@  #include <net/ip6_checksum.h>  #include <scsi/iscsi_if.h> +#define BCM_CNIC	1  #include "cnic_if.h"  #include "bnx2.h" +#include "bnx2x/bnx2x.h"  #include "bnx2x/bnx2x_reg.h"  #include "bnx2x/bnx2x_fw_defs.h"  #include "bnx2x/bnx2x_hsi.h" @@ -51,10 +53,10 @@  #include "cnic.h"  #include "cnic_defs.h" -#define DRV_MODULE_NAME		"cnic" +#define CNIC_MODULE_NAME	"cnic" -static char version[] __devinitdata = -	"Broadcom NetXtreme II CNIC Driver " DRV_MODULE_NAME " v" CNIC_MODULE_VERSION " (" CNIC_MODULE_RELDATE ")\n"; +static char version[] = +	"Broadcom NetXtreme II CNIC Driver " CNIC_MODULE_NAME " v" CNIC_MODULE_VERSION " (" CNIC_MODULE_RELDATE ")\n";  MODULE_AUTHOR("Michael Chan <[email protected]> and John(Zongxi) "  	      "Chen ([email protected]"); @@ -724,7 +726,7 @@ static void cnic_free_dma(struct cnic_dev *dev, struct cnic_dma *dma)  	for (i = 0; i < dma->num_pages; i++) {  		if (dma->pg_arr[i]) { -			dma_free_coherent(&dev->pcidev->dev, BCM_PAGE_SIZE, +			dma_free_coherent(&dev->pcidev->dev, BNX2_PAGE_SIZE,  					  dma->pg_arr[i], dma->pg_map_arr[i]);  			dma->pg_arr[i] = NULL;  		} @@ -783,7 +785,7 @@ static int cnic_alloc_dma(struct cnic_dev *dev, struct cnic_dma *dma,  	for (i = 0; i < pages; i++) {  		dma->pg_arr[i] = dma_alloc_coherent(&dev->pcidev->dev, -						    BCM_PAGE_SIZE, +						    BNX2_PAGE_SIZE,  						    &dma->pg_map_arr[i],  						    GFP_ATOMIC);  		if (dma->pg_arr[i] == NULL) @@ -792,8 +794,8 @@ static int cnic_alloc_dma(struct cnic_dev *dev, struct cnic_dma *dma,  	if (!use_pg_tbl)  		return 0; -	dma->pgtbl_size = ((pages * 8) + BCM_PAGE_SIZE - 1) & -			  ~(BCM_PAGE_SIZE - 1); +	dma->pgtbl_size = ((pages * 8) + BNX2_PAGE_SIZE - 1) & +			  ~(BNX2_PAGE_SIZE - 1);  	dma->pgtbl = dma_alloc_coherent(&dev->pcidev->dev, dma->pgtbl_size,  					&dma->pgtbl_map, GFP_ATOMIC);  	if (dma->pgtbl == NULL) @@ -895,11 +897,11 @@ static int cnic_alloc_context(struct cnic_dev *dev)  {  	struct cnic_local *cp = dev->cnic_priv; -	if (CHIP_NUM(cp) == CHIP_NUM_5709) { +	if (BNX2_CHIP(cp) == BNX2_CHIP_5709) {  		int i, k, arr_size; -		cp->ctx_blk_size = BCM_PAGE_SIZE; -		cp->cids_per_blk = BCM_PAGE_SIZE / 128; +		cp->ctx_blk_size = BNX2_PAGE_SIZE; +		cp->cids_per_blk = BNX2_PAGE_SIZE / 128;  		arr_size = BNX2_MAX_CID / cp->cids_per_blk *  			   sizeof(struct cnic_ctx);  		cp->ctx_arr = kzalloc(arr_size, GFP_KERNEL); @@ -931,7 +933,7 @@ static int cnic_alloc_context(struct cnic_dev *dev)  		for (i = 0; i < cp->ctx_blks; i++) {  			cp->ctx_arr[i].ctx =  				dma_alloc_coherent(&dev->pcidev->dev, -						   BCM_PAGE_SIZE, +						   BNX2_PAGE_SIZE,  						   &cp->ctx_arr[i].mapping,  						   GFP_KERNEL);  			if (cp->ctx_arr[i].ctx == NULL) @@ -1011,7 +1013,7 @@ static int __cnic_alloc_uio_rings(struct cnic_uio_dev *udev, int pages)  	if (udev->l2_ring)  		return 0; -	udev->l2_ring_size = pages * BCM_PAGE_SIZE; +	udev->l2_ring_size = pages * BNX2_PAGE_SIZE;  	udev->l2_ring = dma_alloc_coherent(&udev->pdev->dev, udev->l2_ring_size,  					   &udev->l2_ring_map,  					   GFP_KERNEL | __GFP_COMP); @@ -1234,8 +1236,6 @@ static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev)  	int i, j, n, ret, pages;  	struct cnic_dma *kwq_16_dma = &cp->kwq_16_data_info; -	cp->iro_arr = ethdev->iro_arr; -  	cp->max_cid_space = MAX_ISCSI_TBL_SZ;  	cp->iscsi_start_cid = start_cid;  	cp->fcoe_start_cid = start_cid + MAX_ISCSI_TBL_SZ; @@ -1430,6 +1430,7 @@ static void cnic_reply_bnx2x_kcqes(struct cnic_dev *dev, int ulp_type,  static int cnic_bnx2x_iscsi_init1(struct cnic_dev *dev, struct kwqe *kwqe)  {  	struct cnic_local *cp = dev->cnic_priv; +	struct bnx2x *bp = netdev_priv(dev->netdev);  	struct iscsi_kwqe_init1 *req1 = (struct iscsi_kwqe_init1 *) kwqe;  	int hq_bds, pages;  	u32 pfid = cp->pfid; @@ -1512,6 +1513,7 @@ static int cnic_bnx2x_iscsi_init2(struct cnic_dev *dev, struct kwqe *kwqe)  {  	struct iscsi_kwqe_init2 *req2 = (struct iscsi_kwqe_init2 *) kwqe;  	struct cnic_local *cp = dev->cnic_priv; +	struct bnx2x *bp = netdev_priv(dev->netdev);  	u32 pfid = cp->pfid;  	struct iscsi_kcqe kcqe;  	struct kcqe *cqes[1]; @@ -2048,6 +2050,7 @@ static void cnic_init_storm_conn_bufs(struct cnic_dev *dev,  static void cnic_init_bnx2x_mac(struct cnic_dev *dev)  {  	struct cnic_local *cp = dev->cnic_priv; +	struct bnx2x *bp = netdev_priv(dev->netdev);  	u32 pfid = cp->pfid;  	u8 *mac = dev->mac_addr; @@ -2084,6 +2087,7 @@ static void cnic_init_bnx2x_mac(struct cnic_dev *dev)  static void cnic_bnx2x_set_tcp_timestamp(struct cnic_dev *dev, int tcp_ts)  {  	struct cnic_local *cp = dev->cnic_priv; +	struct bnx2x *bp = netdev_priv(dev->netdev);  	u8 xstorm_flags = XSTORM_L5CM_TCP_FLAGS_WND_SCL_EN;  	u16 tstorm_flags = 0; @@ -2103,6 +2107,7 @@ static int cnic_bnx2x_connect(struct cnic_dev *dev, struct kwqe *wqes[],  			      u32 num, int *work)  {  	struct cnic_local *cp = dev->cnic_priv; +	struct bnx2x *bp = netdev_priv(dev->netdev);  	struct l4_kwq_connect_req1 *kwqe1 =  		(struct l4_kwq_connect_req1 *) wqes[0];  	struct l4_kwq_connect_req3 *kwqe3; @@ -2898,7 +2903,7 @@ static int cnic_l2_completion(struct cnic_local *cp)  	u16 hw_cons, sw_cons;  	struct cnic_uio_dev *udev = cp->udev;  	union eth_rx_cqe *cqe, *cqe_ring = (union eth_rx_cqe *) -					(udev->l2_ring + (2 * BCM_PAGE_SIZE)); +					(udev->l2_ring + (2 * BNX2_PAGE_SIZE));  	u32 cmd;  	int comp = 0; @@ -3853,12 +3858,17 @@ static int cnic_cm_abort(struct cnic_sock *csk)  		return cnic_cm_abort_req(csk);  	/* Getting here means that we haven't started connect, or -	 * connect was not successful. +	 * connect was not successful, or it has been reset by the target.  	 */  	cp->close_conn(csk, opcode); -	if (csk->state != opcode) +	if (csk->state != opcode) { +		/* Wait for remote reset sequence to complete */ +		while (test_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags)) +			msleep(1); +  		return -EALREADY; +	}  	return 0;  } @@ -3872,6 +3882,10 @@ static int cnic_cm_close(struct cnic_sock *csk)  		csk->state = L4_KCQE_OPCODE_VALUE_CLOSE_COMP;  		return cnic_cm_close_req(csk);  	} else { +		/* Wait for remote reset sequence to complete */ +		while (test_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags)) +			msleep(1); +  		return -EALREADY;  	}  	return 0; @@ -4200,6 +4214,7 @@ static void cnic_cm_stop_bnx2x_hw(struct cnic_dev *dev)  static int cnic_cm_init_bnx2x_hw(struct cnic_dev *dev)  {  	struct cnic_local *cp = dev->cnic_priv; +	struct bnx2x *bp = netdev_priv(dev->netdev);  	u32 pfid = cp->pfid;  	u32 port = CNIC_PORT(cp); @@ -4349,7 +4364,7 @@ static int cnic_setup_5709_context(struct cnic_dev *dev, int valid)  	int ret = 0, i;  	u32 valid_bit = valid ? BNX2_CTX_HOST_PAGE_TBL_DATA0_VALID : 0; -	if (CHIP_NUM(cp) != CHIP_NUM_5709) +	if (BNX2_CHIP(cp) != BNX2_CHIP_5709)  		return 0;  	for (i = 0; i < cp->ctx_blks; i++) { @@ -4357,7 +4372,7 @@ static int cnic_setup_5709_context(struct cnic_dev *dev, int valid)  		u32 idx = cp->ctx_arr[i].cid / cp->cids_per_blk;  		u32 val; -		memset(cp->ctx_arr[i].ctx, 0, BCM_PAGE_SIZE); +		memset(cp->ctx_arr[i].ctx, 0, BNX2_PAGE_SIZE);  		CNIC_WR(dev, BNX2_CTX_HOST_PAGE_TBL_DATA0,  			(cp->ctx_arr[i].mapping & 0xffffffff) | valid_bit); @@ -4499,7 +4514,7 @@ static void cnic_init_bnx2_tx_ring(struct cnic_dev *dev)  	u32 cid_addr, tx_cid, sb_id;  	u32 val, offset0, offset1, offset2, offset3;  	int i; -	struct tx_bd *txbd; +	struct bnx2_tx_bd *txbd;  	dma_addr_t buf_map, ring_map = udev->l2_ring_map;  	struct status_block *s_blk = cp->status_blk.gen; @@ -4517,7 +4532,7 @@ static void cnic_init_bnx2_tx_ring(struct cnic_dev *dev)  	cp->tx_cons = *cp->tx_cons_ptr;  	cid_addr = GET_CID_ADDR(tx_cid); -	if (CHIP_NUM(cp) == CHIP_NUM_5709) { +	if (BNX2_CHIP(cp) == BNX2_CHIP_5709) {  		u32 cid_addr2 = GET_CID_ADDR(tx_cid + 4) + 0x40;  		for (i = 0; i < PHY_CTX_SIZE; i += 4) @@ -4545,7 +4560,7 @@ static void cnic_init_bnx2_tx_ring(struct cnic_dev *dev)  	txbd = udev->l2_ring;  	buf_map = udev->l2_buf_map; -	for (i = 0; i < MAX_TX_DESC_CNT; i++, txbd++) { +	for (i = 0; i < BNX2_MAX_TX_DESC_CNT; i++, txbd++) {  		txbd->tx_bd_haddr_hi = (u64) buf_map >> 32;  		txbd->tx_bd_haddr_lo = (u64) buf_map & 0xffffffff;  	} @@ -4565,7 +4580,7 @@ static void cnic_init_bnx2_rx_ring(struct cnic_dev *dev)  	struct cnic_uio_dev *udev = cp->udev;  	u32 cid_addr, sb_id, val, coal_reg, coal_val;  	int i; -	struct rx_bd *rxbd; +	struct bnx2_rx_bd *rxbd;  	struct status_block *s_blk = cp->status_blk.gen;  	dma_addr_t ring_map = udev->l2_ring_map; @@ -4601,8 +4616,8 @@ static void cnic_init_bnx2_rx_ring(struct cnic_dev *dev)  		val = BNX2_L2CTX_L2_STATUSB_NUM(sb_id);  	cnic_ctx_wr(dev, cid_addr, BNX2_L2CTX_HOST_BDIDX, val); -	rxbd = udev->l2_ring + BCM_PAGE_SIZE; -	for (i = 0; i < MAX_RX_DESC_CNT; i++, rxbd++) { +	rxbd = udev->l2_ring + BNX2_PAGE_SIZE; +	for (i = 0; i < BNX2_MAX_RX_DESC_CNT; i++, rxbd++) {  		dma_addr_t buf_map;  		int n = (i % cp->l2_rx_ring_size) + 1; @@ -4612,11 +4627,11 @@ static void cnic_init_bnx2_rx_ring(struct cnic_dev *dev)  		rxbd->rx_bd_haddr_hi = (u64) buf_map >> 32;  		rxbd->rx_bd_haddr_lo = (u64) buf_map & 0xffffffff;  	} -	val = (u64) (ring_map + BCM_PAGE_SIZE) >> 32; +	val = (u64) (ring_map + BNX2_PAGE_SIZE) >> 32;  	cnic_ctx_wr(dev, cid_addr, BNX2_L2CTX_NX_BDHADDR_HI, val);  	rxbd->rx_bd_haddr_hi = val; -	val = (u64) (ring_map + BCM_PAGE_SIZE) & 0xffffffff; +	val = (u64) (ring_map + BNX2_PAGE_SIZE) & 0xffffffff;  	cnic_ctx_wr(dev, cid_addr, BNX2_L2CTX_NX_BDHADDR_LO, val);  	rxbd->rx_bd_haddr_lo = val; @@ -4662,7 +4677,7 @@ static void cnic_set_bnx2_mac(struct cnic_dev *dev)  	CNIC_WR(dev, BNX2_EMAC_MAC_MATCH5, val);  	val = 4 | BNX2_RPM_SORT_USER2_BC_EN; -	if (CHIP_NUM(cp) != CHIP_NUM_5709) +	if (BNX2_CHIP(cp) != BNX2_CHIP_5709)  		val |= BNX2_RPM_SORT_USER2_PROM_VLAN;  	CNIC_WR(dev, BNX2_RPM_SORT_USER2, 0x0); @@ -4682,10 +4697,10 @@ static int cnic_start_bnx2_hw(struct cnic_dev *dev)  	val = CNIC_RD(dev, BNX2_MQ_CONFIG);  	val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE; -	if (BCM_PAGE_BITS > 12) +	if (BNX2_PAGE_BITS > 12)  		val |= (12 - 8)  << 4;  	else -		val |= (BCM_PAGE_BITS - 8)  << 4; +		val |= (BNX2_PAGE_BITS - 8)  << 4;  	CNIC_WR(dev, BNX2_MQ_CONFIG, val); @@ -4708,20 +4723,20 @@ static int cnic_start_bnx2_hw(struct cnic_dev *dev)  	cp->kwq_con_idx = 0;  	set_bit(CNIC_LCL_FL_KWQ_INIT, &cp->cnic_local_flags); -	if (CHIP_NUM(cp) == CHIP_NUM_5706 || CHIP_NUM(cp) == CHIP_NUM_5708) +	if (BNX2_CHIP(cp) == BNX2_CHIP_5706 || BNX2_CHIP(cp) == BNX2_CHIP_5708)  		cp->kwq_con_idx_ptr = &sblk->status_rx_quick_consumer_index15;  	else  		cp->kwq_con_idx_ptr = &sblk->status_cmd_consumer_index;  	/* Initialize the kernel work queue context. */  	val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | -	      (BCM_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; +	      (BNX2_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ;  	cnic_ctx_wr(dev, kwq_cid_addr, L5_KRNLQ_TYPE, val); -	val = (BCM_PAGE_SIZE / sizeof(struct kwqe) - 1) << 16; +	val = (BNX2_PAGE_SIZE / sizeof(struct kwqe) - 1) << 16;  	cnic_ctx_wr(dev, kwq_cid_addr, L5_KRNLQ_QE_SELF_SEQ_MAX, val); -	val = ((BCM_PAGE_SIZE / sizeof(struct kwqe)) << 16) | KWQ_PAGE_CNT; +	val = ((BNX2_PAGE_SIZE / sizeof(struct kwqe)) << 16) | KWQ_PAGE_CNT;  	cnic_ctx_wr(dev, kwq_cid_addr, L5_KRNLQ_PGTBL_NPAGES, val);  	val = (u32) ((u64) cp->kwq_info.pgtbl_map >> 32); @@ -4741,13 +4756,13 @@ static int cnic_start_bnx2_hw(struct cnic_dev *dev)  	/* Initialize the kernel complete queue context. */  	val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | -	      (BCM_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; +	      (BNX2_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ;  	cnic_ctx_wr(dev, kcq_cid_addr, L5_KRNLQ_TYPE, val); -	val = (BCM_PAGE_SIZE / sizeof(struct kcqe) - 1) << 16; +	val = (BNX2_PAGE_SIZE / sizeof(struct kcqe) - 1) << 16;  	cnic_ctx_wr(dev, kcq_cid_addr, L5_KRNLQ_QE_SELF_SEQ_MAX, val); -	val = ((BCM_PAGE_SIZE / sizeof(struct kcqe)) << 16) | KCQ_PAGE_CNT; +	val = ((BNX2_PAGE_SIZE / sizeof(struct kcqe)) << 16) | KCQ_PAGE_CNT;  	cnic_ctx_wr(dev, kcq_cid_addr, L5_KRNLQ_PGTBL_NPAGES, val);  	val = (u32) ((u64) cp->kcq1.dma.pgtbl_map >> 32); @@ -4843,6 +4858,7 @@ static inline void cnic_storm_memset_hc_disable(struct cnic_dev *dev,  						u16 sb_id, u8 sb_index,  						u8 disable)  { +	struct bnx2x *bp = netdev_priv(dev->netdev);  	u32 addr = BAR_CSTRORM_INTMEM +  			CSTORM_STATUS_BLOCK_DATA_OFFSET(sb_id) + @@ -4860,6 +4876,7 @@ static inline void cnic_storm_memset_hc_disable(struct cnic_dev *dev,  static void cnic_enable_bnx2x_int(struct cnic_dev *dev)  {  	struct cnic_local *cp = dev->cnic_priv; +	struct bnx2x *bp = netdev_priv(dev->netdev);  	u8 sb_id = cp->status_blk_num;  	CNIC_WR8(dev, BAR_CSTRORM_INTMEM + @@ -4886,10 +4903,10 @@ static void cnic_init_bnx2x_tx_ring(struct cnic_dev *dev,  	u32 cli = cp->ethdev->iscsi_l2_client_id;  	u32 val; -	memset(txbd, 0, BCM_PAGE_SIZE); +	memset(txbd, 0, BNX2_PAGE_SIZE);  	buf_map = udev->l2_buf_map; -	for (i = 0; i < MAX_TX_DESC_CNT; i += 3, txbd += 3) { +	for (i = 0; i < BNX2_MAX_TX_DESC_CNT; i += 3, txbd += 3) {  		struct eth_tx_start_bd *start_bd = &txbd->start_bd;  		struct eth_tx_parse_bd_e1x *pbd_e1x =  			&((txbd + 1)->parse_bd_e1x); @@ -4908,9 +4925,9 @@ static void cnic_init_bnx2x_tx_ring(struct cnic_dev *dev,  		if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id))  			pbd_e2->parsing_data = (UNICAST_ADDRESS << -				 ETH_TX_PARSE_BD_E2_ETH_ADDR_TYPE_SHIFT); +				ETH_TX_PARSE_BD_E2_ETH_ADDR_TYPE_SHIFT);  		else -			 pbd_e1x->global_data = (UNICAST_ADDRESS << +			pbd_e1x->global_data = (UNICAST_ADDRESS <<  				ETH_TX_PARSE_BD_E1X_ETH_ADDR_TYPE_SHIFT);  	} @@ -4945,9 +4962,9 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev,  	struct cnic_local *cp = dev->cnic_priv;  	struct cnic_uio_dev *udev = cp->udev;  	struct eth_rx_bd *rxbd = (struct eth_rx_bd *) (udev->l2_ring + -				BCM_PAGE_SIZE); +				BNX2_PAGE_SIZE);  	struct eth_rx_cqe_next_page *rxcqe = (struct eth_rx_cqe_next_page *) -				(udev->l2_ring + (2 * BCM_PAGE_SIZE)); +				(udev->l2_ring + (2 * BNX2_PAGE_SIZE));  	struct host_sp_status_block *sb = cp->bnx2x_def_status_blk;  	int i;  	u32 cli = cp->ethdev->iscsi_l2_client_id; @@ -4971,20 +4988,20 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev,  		rxbd->addr_lo = cpu_to_le32(buf_map & 0xffffffff);  	} -	val = (u64) (ring_map + BCM_PAGE_SIZE) >> 32; +	val = (u64) (ring_map + BNX2_PAGE_SIZE) >> 32;  	rxbd->addr_hi = cpu_to_le32(val);  	data->rx.bd_page_base.hi = cpu_to_le32(val); -	val = (u64) (ring_map + BCM_PAGE_SIZE) & 0xffffffff; +	val = (u64) (ring_map + BNX2_PAGE_SIZE) & 0xffffffff;  	rxbd->addr_lo = cpu_to_le32(val);  	data->rx.bd_page_base.lo = cpu_to_le32(val);  	rxcqe += BNX2X_MAX_RCQ_DESC_CNT; -	val = (u64) (ring_map + (2 * BCM_PAGE_SIZE)) >> 32; +	val = (u64) (ring_map + (2 * BNX2_PAGE_SIZE)) >> 32;  	rxcqe->addr_hi = cpu_to_le32(val);  	data->rx.cqe_page_base.hi = cpu_to_le32(val); -	val = (u64) (ring_map + (2 * BCM_PAGE_SIZE)) & 0xffffffff; +	val = (u64) (ring_map + (2 * BNX2_PAGE_SIZE)) & 0xffffffff;  	rxcqe->addr_lo = cpu_to_le32(val);  	data->rx.cqe_page_base.lo = cpu_to_le32(val); @@ -5009,6 +5026,7 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev,  static void cnic_init_bnx2x_kcq(struct cnic_dev *dev)  {  	struct cnic_local *cp = dev->cnic_priv; +	struct bnx2x *bp = netdev_priv(dev->netdev);  	u32 pfid = cp->pfid;  	cp->kcq1.io_addr = BAR_CSTRORM_INTMEM + @@ -5047,37 +5065,17 @@ static void cnic_init_bnx2x_kcq(struct cnic_dev *dev)  static int cnic_start_bnx2x_hw(struct cnic_dev *dev)  {  	struct cnic_local *cp = dev->cnic_priv; +	struct bnx2x *bp = netdev_priv(dev->netdev);  	struct cnic_eth_dev *ethdev = cp->ethdev; -	int func = CNIC_FUNC(cp), ret; +	int func, ret;  	u32 pfid;  	dev->stats_addr = ethdev->addr_drv_info_to_mcp; -	cp->port_mode = CHIP_PORT_MODE_NONE; - -	if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id)) { -		u32 val; +	cp->port_mode = bp->common.chip_port_mode; +	cp->pfid = bp->pfid; +	cp->func = bp->pf_num; -		pci_read_config_dword(dev->pcidev, PCICFG_ME_REGISTER, &val); -		cp->func = (u8) ((val & ME_REG_ABS_PF_NUM) >> -				 ME_REG_ABS_PF_NUM_SHIFT); -		func = CNIC_FUNC(cp); - -		val = CNIC_RD(dev, MISC_REG_PORT4MODE_EN_OVWR); -		if (!(val & 1)) -			val = CNIC_RD(dev, MISC_REG_PORT4MODE_EN); -		else -			val = (val >> 1) & 1; - -		if (val) { -			cp->port_mode = CHIP_4_PORT_MODE; -			cp->pfid = func >> 1; -		} else { -			cp->port_mode = CHIP_2_PORT_MODE; -			cp->pfid = func & 0x6; -		} -	} else { -		cp->pfid = func; -	} +	func = CNIC_FUNC(cp);  	pfid = cp->pfid;  	ret = cnic_init_id_tbl(&cp->cid_tbl, MAX_ISCSI_TBL_SZ, @@ -5144,6 +5142,7 @@ static int cnic_start_bnx2x_hw(struct cnic_dev *dev)  static void cnic_init_rings(struct cnic_dev *dev)  {  	struct cnic_local *cp = dev->cnic_priv; +	struct bnx2x *bp = netdev_priv(dev->netdev);  	struct cnic_uio_dev *udev = cp->udev;  	if (test_bit(CNIC_LCL_FL_RINGS_INITED, &cp->cnic_local_flags)) @@ -5249,8 +5248,8 @@ static void cnic_shutdown_rings(struct cnic_dev *dev)  		msleep(10);  	}  	clear_bit(CNIC_LCL_FL_RINGS_INITED, &cp->cnic_local_flags); -	rx_ring = udev->l2_ring + BCM_PAGE_SIZE; -	memset(rx_ring, 0, BCM_PAGE_SIZE); +	rx_ring = udev->l2_ring + BNX2_PAGE_SIZE; +	memset(rx_ring, 0, BNX2_PAGE_SIZE);  }  static int cnic_register_netdev(struct cnic_dev *dev) @@ -5344,8 +5343,28 @@ static void cnic_stop_bnx2_hw(struct cnic_dev *dev)  static void cnic_stop_bnx2x_hw(struct cnic_dev *dev)  {  	struct cnic_local *cp = dev->cnic_priv; +	struct bnx2x *bp = netdev_priv(dev->netdev); +	u32 hc_index = HC_INDEX_ISCSI_EQ_CONS; +	u32 sb_id = cp->status_blk_num; +	u32 idx_off, syn_off;  	cnic_free_irq(dev); + +	if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id)) { +		idx_off = offsetof(struct hc_status_block_e2, index_values) + +			  (hc_index * sizeof(u16)); + +		syn_off = CSTORM_HC_SYNC_LINE_INDEX_E2_OFFSET(hc_index, sb_id); +	} else { +		idx_off = offsetof(struct hc_status_block_e1x, index_values) + +			  (hc_index * sizeof(u16)); + +		syn_off = CSTORM_HC_SYNC_LINE_INDEX_E1X_OFFSET(hc_index, sb_id); +	} +	CNIC_WR16(dev, BAR_CSTRORM_INTMEM + syn_off, 0); +	CNIC_WR16(dev, BAR_CSTRORM_INTMEM + CSTORM_STATUS_BLOCK_OFFSET(sb_id) + +		  idx_off, 0); +  	*cp->kcq1.hw_prod_idx_ptr = 0;  	CNIC_WR(dev, BAR_CSTRORM_INTMEM +  		CSTORM_ISCSI_EQ_CONS_OFFSET(cp->pfid, 0), 0); @@ -5431,14 +5450,12 @@ static struct cnic_dev *init_bnx2_cnic(struct net_device *dev)  	struct pci_dev *pdev;  	struct cnic_dev *cdev;  	struct cnic_local *cp; +	struct bnx2 *bp = netdev_priv(dev);  	struct cnic_eth_dev *ethdev = NULL; -	struct cnic_eth_dev *(*probe)(struct net_device *) = NULL; -	probe = symbol_get(bnx2_cnic_probe); -	if (probe) { -		ethdev = (*probe)(dev); -		symbol_put(bnx2_cnic_probe); -	} +	if (bp->cnic_probe) +		ethdev = (bp->cnic_probe)(dev); +  	if (!ethdev)  		return NULL; @@ -5493,14 +5510,12 @@ static struct cnic_dev *init_bnx2x_cnic(struct net_device *dev)  	struct pci_dev *pdev;  	struct cnic_dev *cdev;  	struct cnic_local *cp; +	struct bnx2x *bp = netdev_priv(dev);  	struct cnic_eth_dev *ethdev = NULL; -	struct cnic_eth_dev *(*probe)(struct net_device *) = NULL; -	probe = symbol_get(bnx2x_cnic_probe); -	if (probe) { -		ethdev = (*probe)(dev); -		symbol_put(bnx2x_cnic_probe); -	} +	if (bp->cnic_probe) +		ethdev = bp->cnic_probe(dev); +  	if (!ethdev)  		return NULL; diff --git a/drivers/net/ethernet/broadcom/cnic.h b/drivers/net/ethernet/broadcom/cnic.h index 148604c3fa0c..62c670619ae6 100644 --- a/drivers/net/ethernet/broadcom/cnic.h +++ b/drivers/net/ethernet/broadcom/cnic.h @@ -80,18 +80,18 @@  #define CNIC_LOCAL_PORT_MAX	61024  #define CNIC_LOCAL_PORT_RANGE	(CNIC_LOCAL_PORT_MAX - CNIC_LOCAL_PORT_MIN) -#define KWQE_CNT (BCM_PAGE_SIZE / sizeof(struct kwqe)) -#define KCQE_CNT (BCM_PAGE_SIZE / sizeof(struct kcqe)) +#define KWQE_CNT (BNX2_PAGE_SIZE / sizeof(struct kwqe)) +#define KCQE_CNT (BNX2_PAGE_SIZE / sizeof(struct kcqe))  #define MAX_KWQE_CNT (KWQE_CNT - 1)  #define MAX_KCQE_CNT (KCQE_CNT - 1)  #define MAX_KWQ_IDX	((KWQ_PAGE_CNT * KWQE_CNT) - 1)  #define MAX_KCQ_IDX	((KCQ_PAGE_CNT * KCQE_CNT) - 1) -#define KWQ_PG(x) (((x) & ~MAX_KWQE_CNT) >> (BCM_PAGE_BITS - 5)) +#define KWQ_PG(x) (((x) & ~MAX_KWQE_CNT) >> (BNX2_PAGE_BITS - 5))  #define KWQ_IDX(x) ((x) & MAX_KWQE_CNT) -#define KCQ_PG(x) (((x) & ~MAX_KCQE_CNT) >> (BCM_PAGE_BITS - 5)) +#define KCQ_PG(x) (((x) & ~MAX_KCQE_CNT) >> (BNX2_PAGE_BITS - 5))  #define KCQ_IDX(x) ((x) & MAX_KCQE_CNT)  #define BNX2X_NEXT_KCQE(x) (((x) & (MAX_KCQE_CNT - 1)) ==		\ @@ -186,14 +186,6 @@ struct kcq_info {  	u16		(*hw_idx)(u16);  }; -struct iro { -	u32 base; -	u16 m1; -	u16 m2; -	u16 m3; -	u16 size; -}; -  struct cnic_uio_dev {  	struct uio_info		cnic_uinfo;  	u32			uio_dev; @@ -241,9 +233,6 @@ struct cnic_local {  	u16		rx_cons;  	u16		tx_cons; -	const struct iro	*iro_arr; -#define IRO (((struct cnic_local *) dev->cnic_priv)->iro_arr) -  	struct cnic_dma		kwq_info;  	struct kwqe		**kwq; @@ -316,9 +305,6 @@ struct cnic_local {  	int			func;  	u32			pfid;  	u8			port_mode; -#define CHIP_4_PORT_MODE	0 -#define CHIP_2_PORT_MODE	1 -#define CHIP_PORT_MODE_NONE	2  	u32			shmem_base; @@ -420,11 +406,11 @@ struct bnx2x_bd_chain_next {  	 BNX2X_CHIP_IS_57840(x))  #define BNX2X_CHIP_IS_E2_PLUS(x) (BNX2X_CHIP_IS_E2(x) || BNX2X_CHIP_IS_E3(x)) -#define IS_E1H_OFFSET       		BNX2X_CHIP_IS_E1H(cp->chip_id) - -#define BNX2X_RX_DESC_CNT		(BCM_PAGE_SIZE / sizeof(struct eth_rx_bd)) +#define BNX2X_RX_DESC_CNT		(BNX2_PAGE_SIZE / \ +					 sizeof(struct eth_rx_bd))  #define BNX2X_MAX_RX_DESC_CNT		(BNX2X_RX_DESC_CNT - 2) -#define BNX2X_RCQ_DESC_CNT		(BCM_PAGE_SIZE / sizeof(union eth_rx_cqe)) +#define BNX2X_RCQ_DESC_CNT		(BNX2_PAGE_SIZE / \ +					 sizeof(union eth_rx_cqe))  #define BNX2X_MAX_RCQ_DESC_CNT		(BNX2X_RCQ_DESC_CNT - 1)  #define BNX2X_NEXT_RCQE(x) (((x) & BNX2X_MAX_RCQ_DESC_CNT) ==		\ diff --git a/drivers/net/ethernet/broadcom/cnic_if.h b/drivers/net/ethernet/broadcom/cnic_if.h index 865095aad1f6..2a35436f9095 100644 --- a/drivers/net/ethernet/broadcom/cnic_if.h +++ b/drivers/net/ethernet/broadcom/cnic_if.h @@ -14,8 +14,8 @@  #include "bnx2x/bnx2x_mfw_req.h" -#define CNIC_MODULE_VERSION	"2.5.14" -#define CNIC_MODULE_RELDATE	"Sep 30, 2012" +#define CNIC_MODULE_VERSION	"2.5.16" +#define CNIC_MODULE_RELDATE	"Dec 05, 2012"  #define CNIC_ULP_RDMA		0  #define CNIC_ULP_ISCSI		1 @@ -353,7 +353,4 @@ extern int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops);  extern int cnic_unregister_driver(int ulp_type); -extern struct cnic_eth_dev *bnx2_cnic_probe(struct net_device *dev); -extern struct cnic_eth_dev *bnx2x_cnic_probe(struct net_device *dev); -  #endif diff --git a/drivers/net/ethernet/broadcom/sb1250-mac.c b/drivers/net/ethernet/broadcom/sb1250-mac.c index 49e7a258da8a..3a1c8a3cf7c9 100644 --- a/drivers/net/ethernet/broadcom/sb1250-mac.c +++ b/drivers/net/ethernet/broadcom/sb1250-mac.c @@ -2586,7 +2586,7 @@ static int sbmac_poll(struct napi_struct *napi, int budget)  } -static int __devinit sbmac_probe(struct platform_device *pldev) +static int sbmac_probe(struct platform_device *pldev)  {  	struct net_device *dev;  	struct sbmac_softc *sc; diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index a8800ac10df9..78ea90c40e19 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c @@ -54,6 +54,9 @@  #include <asm/byteorder.h>  #include <linux/uaccess.h> +#include <uapi/linux/net_tstamp.h> +#include <linux/ptp_clock_kernel.h> +  #ifdef CONFIG_SPARC  #include <asm/idprom.h>  #include <asm/prom.h> @@ -90,10 +93,10 @@ static inline void _tg3_flag_clear(enum TG3_FLAGS flag, unsigned long *bits)  #define DRV_MODULE_NAME		"tg3"  #define TG3_MAJ_NUM			3 -#define TG3_MIN_NUM			125 +#define TG3_MIN_NUM			128  #define DRV_MODULE_VERSION	\  	__stringify(TG3_MAJ_NUM) "." __stringify(TG3_MIN_NUM) -#define DRV_MODULE_RELDATE	"September 26, 2012" +#define DRV_MODULE_RELDATE	"December 03, 2012"  #define RESET_KIND_SHUTDOWN	0  #define RESET_KIND_INIT		1 @@ -211,7 +214,7 @@ static inline void _tg3_flag_clear(enum TG3_FLAGS flag, unsigned long *bits)  #define FIRMWARE_TG3TSO		"tigon/tg3_tso.bin"  #define FIRMWARE_TG3TSO5	"tigon/tg3_tso5.bin" -static char version[] __devinitdata = +static char version[] =  	DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")";  MODULE_AUTHOR("David S. Miller ([email protected]) and Jeff Garzik ([email protected])"); @@ -226,6 +229,9 @@ static int tg3_debug = -1;	/* -1 == use TG3_DEF_MSG_ENABLE as value */  module_param(tg3_debug, int, 0);  MODULE_PARM_DESC(tg3_debug, "Tigon3 bitmapped debugging message enable value"); +#define TG3_DRV_DATA_FLAG_10_100_ONLY	0x0001 +#define TG3_DRV_DATA_FLAG_5705_10_100	0x0002 +  static DEFINE_PCI_DEVICE_TABLE(tg3_pci_tbl) = {  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5700)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5701)}, @@ -245,20 +251,28 @@ static DEFINE_PCI_DEVICE_TABLE(tg3_pci_tbl) = {  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5782)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5788)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5789)}, -	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901)}, -	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901_2)}, +	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901), +	 .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY | +			TG3_DRV_DATA_FLAG_5705_10_100}, +	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901_2), +	 .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY | +			TG3_DRV_DATA_FLAG_5705_10_100},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704S_2)}, -	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705F)}, +	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705F), +	 .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY | +			TG3_DRV_DATA_FLAG_5705_10_100},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5721)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5722)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751M)}, -	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751F)}, +	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751F), +	 .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5752)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5752M)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753M)}, -	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753F)}, +	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753F), +	 .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754M)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755)}, @@ -266,8 +280,13 @@ static DEFINE_PCI_DEVICE_TABLE(tg3_pci_tbl) = {  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5756)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5786)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787)}, +	{PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5787M, +			PCI_VENDOR_ID_LENOVO, +			TG3PCI_SUBDEVICE_ID_LENOVO_5787M), +	 .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787M)}, -	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787F)}, +	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787F), +	 .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714S)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715)}, @@ -286,18 +305,28 @@ static DEFINE_PCI_DEVICE_TABLE(tg3_pci_tbl) = {  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5761SE)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5785_G)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5785_F)}, +	{PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57780, +			PCI_VENDOR_ID_AI, TG3PCI_SUBDEVICE_ID_ACER_57780_A), +	 .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY}, +	{PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57780, +			PCI_VENDOR_ID_AI, TG3PCI_SUBDEVICE_ID_ACER_57780_B), +	 .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57780)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57760)}, -	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57790)}, +	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57790), +	 .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57788)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5717)}, +	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5717_C)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5718)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57781)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57785)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57761)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57765)}, -	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57791)}, -	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57795)}, +	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57791), +	 .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY}, +	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57795), +	 .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5719)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5720)},  	{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57762)}, @@ -398,19 +427,27 @@ static const struct {  };  #define TG3_NUM_STATS	ARRAY_SIZE(ethtool_stats_keys) +#define TG3_NVRAM_TEST		0 +#define TG3_LINK_TEST		1 +#define TG3_REGISTER_TEST	2 +#define TG3_MEMORY_TEST		3 +#define TG3_MAC_LOOPB_TEST	4 +#define TG3_PHY_LOOPB_TEST	5 +#define TG3_EXT_LOOPB_TEST	6 +#define TG3_INTERRUPT_TEST	7  static const struct {  	const char string[ETH_GSTRING_LEN];  } ethtool_test_keys[] = { -	{ "nvram test        (online) " }, -	{ "link test         (online) " }, -	{ "register test     (offline)" }, -	{ "memory test       (offline)" }, -	{ "mac loopback test (offline)" }, -	{ "phy loopback test (offline)" }, -	{ "ext loopback test (offline)" }, -	{ "interrupt test    (offline)" }, +	[TG3_NVRAM_TEST]	= { "nvram test        (online) " }, +	[TG3_LINK_TEST]		= { "link test         (online) " }, +	[TG3_REGISTER_TEST]	= { "register test     (offline)" }, +	[TG3_MEMORY_TEST]	= { "memory test       (offline)" }, +	[TG3_MAC_LOOPB_TEST]	= { "mac loopback test (offline)" }, +	[TG3_PHY_LOOPB_TEST]	= { "phy loopback test (offline)" }, +	[TG3_EXT_LOOPB_TEST]	= { "ext loopback test (offline)" }, +	[TG3_INTERRUPT_TEST]	= { "interrupt test    (offline)" },  };  #define TG3_NUM_TEST	ARRAY_SIZE(ethtool_test_keys) @@ -2447,6 +2484,18 @@ static int tg3_phy_reset_5703_4_5(struct tg3 *tp)  	return err;  } +static void tg3_carrier_on(struct tg3 *tp) +{ +	netif_carrier_on(tp->dev); +	tp->link_up = true; +} + +static void tg3_carrier_off(struct tg3 *tp) +{ +	netif_carrier_off(tp->dev); +	tp->link_up = false; +} +  /* This will reset the tigon3 PHY if there is no valid   * link unless the FORCE argument is non-zero.   */ @@ -2465,8 +2514,8 @@ static int tg3_phy_reset(struct tg3 *tp)  	if (err != 0)  		return -EBUSY; -	if (netif_running(tp->dev) && netif_carrier_ok(tp->dev)) { -		netif_carrier_off(tp->dev); +	if (netif_running(tp->dev) && tp->link_up) { +		tg3_carrier_off(tp);  		tg3_link_report(tp);  	} @@ -4160,6 +4209,24 @@ static bool tg3_phy_copper_fetch_rmtadv(struct tg3 *tp, u32 *rmtadv)  	return true;  } +static bool tg3_test_and_report_link_chg(struct tg3 *tp, int curr_link_up) +{ +	if (curr_link_up != tp->link_up) { +		if (curr_link_up) { +			tg3_carrier_on(tp); +		} else { +			tg3_carrier_off(tp); +			if (tp->phy_flags & TG3_PHYFLG_MII_SERDES) +				tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT; +		} + +		tg3_link_report(tp); +		return true; +	} + +	return false; +} +  static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)  {  	int current_link_up; @@ -4192,7 +4259,7 @@ static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)  	if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||  	     GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||  	     GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) && -	    netif_carrier_ok(tp->dev)) { +	    tp->link_up) {  		tg3_readphy(tp, MII_BMSR, &bmsr);  		if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&  		    !(bmsr & BMSR_LSTATUS)) @@ -4434,13 +4501,7 @@ relink:  						 PCI_EXP_LNKCTL_CLKREQ_EN);  	} -	if (current_link_up != netif_carrier_ok(tp->dev)) { -		if (current_link_up) -			netif_carrier_on(tp->dev); -		else -			netif_carrier_off(tp->dev); -		tg3_link_report(tp); -	} +	tg3_test_and_report_link_chg(tp, current_link_up);  	return 0;  } @@ -5080,7 +5141,7 @@ static int tg3_setup_fiber_phy(struct tg3 *tp, int force_reset)  	orig_active_duplex = tp->link_config.active_duplex;  	if (!tg3_flag(tp, HW_AUTONEG) && -	    netif_carrier_ok(tp->dev) && +	    tp->link_up &&  	    tg3_flag(tp, INIT_COMPLETE)) {  		mac_status = tr32(MAC_STATUS);  		mac_status &= (MAC_STATUS_PCS_SYNCED | @@ -5158,13 +5219,7 @@ static int tg3_setup_fiber_phy(struct tg3 *tp, int force_reset)  				    LED_CTRL_TRAFFIC_OVERRIDE));  	} -	if (current_link_up != netif_carrier_ok(tp->dev)) { -		if (current_link_up) -			netif_carrier_on(tp->dev); -		else -			netif_carrier_off(tp->dev); -		tg3_link_report(tp); -	} else { +	if (!tg3_test_and_report_link_chg(tp, current_link_up)) {  		u32 now_pause_cfg = tp->link_config.active_flowctrl;  		if (orig_pause_cfg != now_pause_cfg ||  		    orig_active_speed != tp->link_config.active_speed || @@ -5257,7 +5312,7 @@ static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset)  			new_bmcr |= BMCR_SPEED1000;  			/* Force a linkdown */ -			if (netif_carrier_ok(tp->dev)) { +			if (tp->link_up) {  				u32 adv;  				err |= tg3_readphy(tp, MII_ADVERTISE, &adv); @@ -5269,7 +5324,7 @@ static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset)  							   BMCR_ANRESTART |  							   BMCR_ANENABLE);  				udelay(10); -				netif_carrier_off(tp->dev); +				tg3_carrier_off(tp);  			}  			tg3_writephy(tp, MII_BMCR, new_bmcr);  			bmcr = new_bmcr; @@ -5335,15 +5390,7 @@ static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset)  	tp->link_config.active_speed = current_speed;  	tp->link_config.active_duplex = current_duplex; -	if (current_link_up != netif_carrier_ok(tp->dev)) { -		if (current_link_up) -			netif_carrier_on(tp->dev); -		else { -			netif_carrier_off(tp->dev); -			tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT; -		} -		tg3_link_report(tp); -	} +	tg3_test_and_report_link_chg(tp, current_link_up);  	return err;  } @@ -5355,7 +5402,7 @@ static void tg3_serdes_parallel_detect(struct tg3 *tp)  		return;  	} -	if (!netif_carrier_ok(tp->dev) && +	if (!tp->link_up &&  	    (tp->link_config.autoneg == AUTONEG_ENABLE)) {  		u32 bmcr; @@ -5385,7 +5432,7 @@ static void tg3_serdes_parallel_detect(struct tg3 *tp)  				tp->phy_flags |= TG3_PHYFLG_PARALLEL_DETECT;  			}  		} -	} else if (netif_carrier_ok(tp->dev) && +	} else if (tp->link_up &&  		   (tp->link_config.autoneg == AUTONEG_ENABLE) &&  		   (tp->phy_flags & TG3_PHYFLG_PARALLEL_DETECT)) {  		u32 phy2; @@ -5451,7 +5498,7 @@ static int tg3_setup_phy(struct tg3 *tp, int force_reset)  		     (32 << TX_LENGTHS_SLOT_TIME_SHIFT));  	if (!tg3_flag(tp, 5705_PLUS)) { -		if (netif_carrier_ok(tp->dev)) { +		if (tp->link_up) {  			tw32(HOSTCC_STAT_COAL_TICKS,  			     tp->coal.stats_block_coalesce_usecs);  		} else { @@ -5461,7 +5508,7 @@ static int tg3_setup_phy(struct tg3 *tp, int force_reset)  	if (tg3_flag(tp, ASPM_WORKAROUND)) {  		val = tr32(PCIE_PWR_MGMT_THRESH); -		if (!netif_carrier_ok(tp->dev)) +		if (!tp->link_up)  			val = (val & ~PCIE_PWR_MGMT_L1_THRESH_MSK) |  			      tp->pwrmgmt_thresh;  		else @@ -5472,6 +5519,190 @@ static int tg3_setup_phy(struct tg3 *tp, int force_reset)  	return err;  } +/* tp->lock must be held */ +static u64 tg3_refclk_read(struct tg3 *tp) +{ +	u64 stamp = tr32(TG3_EAV_REF_CLCK_LSB); +	return stamp | (u64)tr32(TG3_EAV_REF_CLCK_MSB) << 32; +} + +/* tp->lock must be held */ +static void tg3_refclk_write(struct tg3 *tp, u64 newval) +{ +	tw32(TG3_EAV_REF_CLCK_CTL, TG3_EAV_REF_CLCK_CTL_STOP); +	tw32(TG3_EAV_REF_CLCK_LSB, newval & 0xffffffff); +	tw32(TG3_EAV_REF_CLCK_MSB, newval >> 32); +	tw32_f(TG3_EAV_REF_CLCK_CTL, TG3_EAV_REF_CLCK_CTL_RESUME); +} + +static inline void tg3_full_lock(struct tg3 *tp, int irq_sync); +static inline void tg3_full_unlock(struct tg3 *tp); +static int tg3_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info) +{ +	struct tg3 *tp = netdev_priv(dev); + +	info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE | +				SOF_TIMESTAMPING_RX_SOFTWARE | +				SOF_TIMESTAMPING_SOFTWARE    | +				SOF_TIMESTAMPING_TX_HARDWARE | +				SOF_TIMESTAMPING_RX_HARDWARE | +				SOF_TIMESTAMPING_RAW_HARDWARE; + +	if (tp->ptp_clock) +		info->phc_index = ptp_clock_index(tp->ptp_clock); +	else +		info->phc_index = -1; + +	info->tx_types = (1 << HWTSTAMP_TX_OFF) | (1 << HWTSTAMP_TX_ON); + +	info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) | +			   (1 << HWTSTAMP_FILTER_PTP_V1_L4_EVENT) | +			   (1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT) | +			   (1 << HWTSTAMP_FILTER_PTP_V2_L4_EVENT); +	return 0; +} + +static int tg3_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) +{ +	struct tg3 *tp = container_of(ptp, struct tg3, ptp_info); +	bool neg_adj = false; +	u32 correction = 0; + +	if (ppb < 0) { +		neg_adj = true; +		ppb = -ppb; +	} + +	/* Frequency adjustment is performed using hardware with a 24 bit +	 * accumulator and a programmable correction value. On each clk, the +	 * correction value gets added to the accumulator and when it +	 * overflows, the time counter is incremented/decremented. +	 * +	 * So conversion from ppb to correction value is +	 *		ppb * (1 << 24) / 1000000000 +	 */ +	correction = div_u64((u64)ppb * (1 << 24), 1000000000ULL) & +		     TG3_EAV_REF_CLK_CORRECT_MASK; + +	tg3_full_lock(tp, 0); + +	if (correction) +		tw32(TG3_EAV_REF_CLK_CORRECT_CTL, +		     TG3_EAV_REF_CLK_CORRECT_EN | +		     (neg_adj ? TG3_EAV_REF_CLK_CORRECT_NEG : 0) | correction); +	else +		tw32(TG3_EAV_REF_CLK_CORRECT_CTL, 0); + +	tg3_full_unlock(tp); + +	return 0; +} + +static int tg3_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta) +{ +	struct tg3 *tp = container_of(ptp, struct tg3, ptp_info); + +	tg3_full_lock(tp, 0); +	tp->ptp_adjust += delta; +	tg3_full_unlock(tp); + +	return 0; +} + +static int tg3_ptp_gettime(struct ptp_clock_info *ptp, struct timespec *ts) +{ +	u64 ns; +	u32 remainder; +	struct tg3 *tp = container_of(ptp, struct tg3, ptp_info); + +	tg3_full_lock(tp, 0); +	ns = tg3_refclk_read(tp); +	ns += tp->ptp_adjust; +	tg3_full_unlock(tp); + +	ts->tv_sec = div_u64_rem(ns, 1000000000, &remainder); +	ts->tv_nsec = remainder; + +	return 0; +} + +static int tg3_ptp_settime(struct ptp_clock_info *ptp, +			   const struct timespec *ts) +{ +	u64 ns; +	struct tg3 *tp = container_of(ptp, struct tg3, ptp_info); + +	ns = timespec_to_ns(ts); + +	tg3_full_lock(tp, 0); +	tg3_refclk_write(tp, ns); +	tp->ptp_adjust = 0; +	tg3_full_unlock(tp); + +	return 0; +} + +static int tg3_ptp_enable(struct ptp_clock_info *ptp, +			  struct ptp_clock_request *rq, int on) +{ +	return -EOPNOTSUPP; +} + +static const struct ptp_clock_info tg3_ptp_caps = { +	.owner		= THIS_MODULE, +	.name		= "tg3 clock", +	.max_adj	= 250000000, +	.n_alarm	= 0, +	.n_ext_ts	= 0, +	.n_per_out	= 0, +	.pps		= 0, +	.adjfreq	= tg3_ptp_adjfreq, +	.adjtime	= tg3_ptp_adjtime, +	.gettime	= tg3_ptp_gettime, +	.settime	= tg3_ptp_settime, +	.enable		= tg3_ptp_enable, +}; + +static void tg3_hwclock_to_timestamp(struct tg3 *tp, u64 hwclock, +				     struct skb_shared_hwtstamps *timestamp) +{ +	memset(timestamp, 0, sizeof(struct skb_shared_hwtstamps)); +	timestamp->hwtstamp  = ns_to_ktime((hwclock & TG3_TSTAMP_MASK) + +					   tp->ptp_adjust); +} + +/* tp->lock must be held */ +static void tg3_ptp_init(struct tg3 *tp) +{ +	if (!tg3_flag(tp, PTP_CAPABLE)) +		return; + +	/* Initialize the hardware clock to the system time. */ +	tg3_refclk_write(tp, ktime_to_ns(ktime_get_real())); +	tp->ptp_adjust = 0; +	tp->ptp_info = tg3_ptp_caps; +} + +/* tp->lock must be held */ +static void tg3_ptp_resume(struct tg3 *tp) +{ +	if (!tg3_flag(tp, PTP_CAPABLE)) +		return; + +	tg3_refclk_write(tp, ktime_to_ns(ktime_get_real()) + tp->ptp_adjust); +	tp->ptp_adjust = 0; +} + +static void tg3_ptp_fini(struct tg3 *tp) +{ +	if (!tg3_flag(tp, PTP_CAPABLE) || !tp->ptp_clock) +		return; + +	ptp_clock_unregister(tp->ptp_clock); +	tp->ptp_clock = NULL; +	tp->ptp_adjust = 0; +} +  static inline int tg3_irq_sync(struct tg3 *tp)  {  	return tp->irq_sync; @@ -5652,6 +5883,16 @@ static void tg3_tx(struct tg3_napi *tnapi)  			return;  		} +		if (tnapi->tx_ring[sw_idx].len_flags & TXD_FLAG_HWTSTAMP) { +			struct skb_shared_hwtstamps timestamp; +			u64 hwclock = tr32(TG3_TX_TSTAMP_LSB); +			hwclock |= (u64)tr32(TG3_TX_TSTAMP_MSB) << 32; + +			tg3_hwclock_to_timestamp(tp, hwclock, ×tamp); + +			skb_tstamp_tx(skb, ×tamp); +		} +  		pci_unmap_single(tp->pdev,  				 dma_unmap_addr(ri, mapping),  				 skb_headlen(skb), @@ -5919,6 +6160,7 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)  		dma_addr_t dma_addr;  		u32 opaque_key, desc_idx, *post_ptr;  		u8 *data; +		u64 tstamp = 0;  		desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK;  		opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK; @@ -5953,6 +6195,14 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)  		len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) -  		      ETH_FCS_LEN; +		if ((desc->type_flags & RXD_FLAG_PTPSTAT_MASK) == +		     RXD_FLAG_PTPSTAT_PTPV1 || +		    (desc->type_flags & RXD_FLAG_PTPSTAT_MASK) == +		     RXD_FLAG_PTPSTAT_PTPV2) { +			tstamp = tr32(TG3_RX_TSTAMP_LSB); +			tstamp |= (u64)tr32(TG3_RX_TSTAMP_MSB) << 32; +		} +  		if (len > TG3_RX_COPY_THRESH(tp)) {  			int skb_size;  			unsigned int frag_size; @@ -5996,6 +6246,10 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)  		}  		skb_put(skb, len); +		if (tstamp) +			tg3_hwclock_to_timestamp(tp, tstamp, +						 skb_hwtstamps(skb)); +  		if ((tp->dev->features & NETIF_F_RXCSUM) &&  		    (desc->type_flags & RXD_FLAG_TCPUDP_CSUM) &&  		    (((desc->ip_tcp_csum & RXD_TCPCSUM_MASK) @@ -6477,17 +6731,24 @@ static inline void tg3_netif_stop(struct tg3 *tp)  {  	tp->dev->trans_start = jiffies;	/* prevent tx timeout */  	tg3_napi_disable(tp); +	netif_carrier_off(tp->dev);  	netif_tx_disable(tp->dev);  } +/* tp->lock must be held */  static inline void tg3_netif_start(struct tg3 *tp)  { +	tg3_ptp_resume(tp); +  	/* NOTE: unconditional netif_tx_wake_all_queues is only  	 * appropriate so long as all callers are assured to  	 * have free tx slots (such as after tg3_init_hw)  	 */  	netif_tx_wake_all_queues(tp->dev); +	if (tp->link_up) +		netif_carrier_on(tp->dev); +  	tg3_napi_enable(tp);  	tp->napi[0].hw_status->status |= SD_STATUS_UPDATED;  	tg3_enable_ints(tp); @@ -7046,6 +7307,12 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)  		vlan = vlan_tx_tag_get(skb);  	} +	if ((unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) && +	    tg3_flag(tp, TX_TSTAMP_EN)) { +		skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; +		base_flags |= TXD_FLAG_HWTSTAMP; +	} +  	len = skb_headlen(skb);  	mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE); @@ -8386,7 +8653,7 @@ static void __tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec)  		tw32(HOSTCC_RXCOAL_TICK_INT, ec->rx_coalesce_usecs_irq);  		tw32(HOSTCC_TXCOAL_TICK_INT, ec->tx_coalesce_usecs_irq); -		if (!netif_carrier_ok(tp->dev)) +		if (!tp->link_up)  			val = 0;  		tw32(HOSTCC_STAT_COAL_TICKS, val); @@ -8662,14 +8929,14 @@ static void tg3_rss_check_indir_tbl(struct tg3 *tp)  	if (!tg3_flag(tp, SUPPORT_MSIX))  		return; -	if (tp->irq_cnt <= 2) { +	if (tp->rxq_cnt == 1) {  		memset(&tp->rss_ind_tbl[0], 0, sizeof(tp->rss_ind_tbl));  		return;  	}  	/* Validate table against current IRQ count */  	for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++) { -		if (tp->rss_ind_tbl[i] >= tp->irq_cnt - 1) +		if (tp->rss_ind_tbl[i] >= tp->rxq_cnt)  			break;  	} @@ -8914,9 +9181,15 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)  	 */  	tp->grc_mode |= GRC_MODE_NO_TX_PHDR_CSUM; -	tw32(GRC_MODE, -	     tp->grc_mode | -	     (GRC_MODE_IRQ_ON_MAC_ATTN | GRC_MODE_HOST_STACKUP)); +	val = GRC_MODE_IRQ_ON_MAC_ATTN | GRC_MODE_HOST_STACKUP; +	if (tp->rxptpctl) +		tw32(TG3_RX_PTP_CTL, +		     tp->rxptpctl | TG3_RX_PTP_CTL_HWTS_INTERLOCK); + +	if (tg3_flag(tp, PTP_CAPABLE)) +		val |= GRC_MODE_TIME_SYNC_ENABLE; + +	tw32(GRC_MODE, tp->grc_mode | val);  	/* Setup the timer prescalar register.  Clock is always 66Mhz. */  	val = tr32(GRC_MISC_CFG); @@ -9679,7 +9952,7 @@ static void tg3_periodic_fetch_stats(struct tg3 *tp)  {  	struct tg3_hw_stats *sp = tp->hw_stats; -	if (!netif_carrier_ok(tp->dev)) +	if (!tp->link_up)  		return;  	TG3_STAT_ADD32(&sp->tx_octets, MAC_TX_STATS_OCTETS); @@ -9823,11 +10096,11 @@ static void tg3_timer(unsigned long __opaque)  			u32 mac_stat = tr32(MAC_STATUS);  			int need_setup = 0; -			if (netif_carrier_ok(tp->dev) && +			if (tp->link_up &&  			    (mac_stat & MAC_STATUS_LNKSTATE_CHANGED)) {  				need_setup = 1;  			} -			if (!netif_carrier_ok(tp->dev) && +			if (!tp->link_up &&  			    (mac_stat & (MAC_STATUS_PCS_SYNCED |  					 MAC_STATUS_SIGNAL_DET))) {  				need_setup = 1; @@ -9890,7 +10163,7 @@ restart_timer:  	add_timer(&tp->timer);  } -static void __devinit tg3_timer_init(struct tg3 *tp) +static void tg3_timer_init(struct tg3 *tp)  {  	if (tg3_flag(tp, TAGGED_STATUS) &&  	    GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5717 && @@ -10316,7 +10589,8 @@ static void tg3_ints_fini(struct tg3 *tp)  	tg3_flag_clear(tp, ENABLE_TSS);  } -static int tg3_start(struct tg3 *tp, bool reset_phy, bool test_irq) +static int tg3_start(struct tg3 *tp, bool reset_phy, bool test_irq, +		     bool init)  {  	struct net_device *dev = tp->dev;  	int i, err; @@ -10395,6 +10669,12 @@ static int tg3_start(struct tg3 *tp, bool reset_phy, bool test_irq)  	tg3_flag_set(tp, INIT_COMPLETE);  	tg3_enable_ints(tp); +	if (init) +		tg3_ptp_init(tp); +	else +		tg3_ptp_resume(tp); + +  	tg3_full_unlock(tp);  	netif_tx_start_all_queues(dev); @@ -10429,10 +10709,8 @@ static void tg3_stop(struct tg3 *tp)  {  	int i; -	tg3_napi_disable(tp);  	tg3_reset_task_cancel(tp); - -	netif_tx_disable(tp->dev); +	tg3_netif_stop(tp);  	tg3_timer_stop(tp); @@ -10481,7 +10759,7 @@ static int tg3_open(struct net_device *dev)  		}  	} -	netif_carrier_off(tp->dev); +	tg3_carrier_off(tp);  	err = tg3_power_up(tp);  	if (err) @@ -10494,11 +10772,19 @@ static int tg3_open(struct net_device *dev)  	tg3_full_unlock(tp); -	err = tg3_start(tp, true, true); +	err = tg3_start(tp, true, true, true);  	if (err) {  		tg3_frob_aux_power(tp, false);  		pci_set_power_state(tp->pdev, PCI_D3hot);  	} + +	if (tg3_flag(tp, PTP_CAPABLE)) { +		tp->ptp_clock = ptp_clock_register(&tp->ptp_info, +						   &tp->pdev->dev); +		if (IS_ERR(tp->ptp_clock)) +			tp->ptp_clock = NULL; +	} +  	return err;  } @@ -10506,6 +10792,8 @@ static int tg3_close(struct net_device *dev)  {  	struct tg3 *tp = netdev_priv(dev); +	tg3_ptp_fini(tp); +  	tg3_stop(tp);  	/* Clear stats across close / open calls */ @@ -10514,7 +10802,7 @@ static int tg3_close(struct net_device *dev)  	tg3_power_down(tp); -	netif_carrier_off(tp->dev); +	tg3_carrier_off(tp);  	return 0;  } @@ -10888,7 +11176,7 @@ static int tg3_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)  			cmd->advertising |= ADVERTISED_Asym_Pause;  		}  	} -	if (netif_running(dev) && netif_carrier_ok(dev)) { +	if (netif_running(dev) && tp->link_up) {  		ethtool_cmd_speed_set(cmd, tp->link_config.active_speed);  		cmd->duplex = tp->link_config.active_duplex;  		cmd->lp_advertising = tp->link_config.rmt_adv; @@ -11406,9 +11694,9 @@ static int tg3_set_channels(struct net_device *dev,  	tg3_stop(tp); -	netif_carrier_off(dev); +	tg3_carrier_off(tp); -	tg3_start(tp, true, false); +	tg3_start(tp, true, false, false);  	return 0;  } @@ -11755,7 +12043,7 @@ static int tg3_test_link(struct tg3 *tp)  		max = TG3_COPPER_TIMEOUT_SEC;  	for (i = 0; i < max; i++) { -		if (netif_carrier_ok(tp->dev)) +		if (tp->link_up)  			return 0;  		if (msleep_interruptible(1000)) @@ -12326,19 +12614,19 @@ static int tg3_test_loopback(struct tg3 *tp, u64 *data, bool do_extlpbk)  	tp->phy_flags &= ~TG3_PHYFLG_EEE_CAP;  	if (!netif_running(tp->dev)) { -		data[0] = TG3_LOOPBACK_FAILED; -		data[1] = TG3_LOOPBACK_FAILED; +		data[TG3_MAC_LOOPB_TEST] = TG3_LOOPBACK_FAILED; +		data[TG3_PHY_LOOPB_TEST] = TG3_LOOPBACK_FAILED;  		if (do_extlpbk) -			data[2] = TG3_LOOPBACK_FAILED; +			data[TG3_EXT_LOOPB_TEST] = TG3_LOOPBACK_FAILED;  		goto done;  	}  	err = tg3_reset_hw(tp, 1);  	if (err) { -		data[0] = TG3_LOOPBACK_FAILED; -		data[1] = TG3_LOOPBACK_FAILED; +		data[TG3_MAC_LOOPB_TEST] = TG3_LOOPBACK_FAILED; +		data[TG3_PHY_LOOPB_TEST] = TG3_LOOPBACK_FAILED;  		if (do_extlpbk) -			data[2] = TG3_LOOPBACK_FAILED; +			data[TG3_EXT_LOOPB_TEST] = TG3_LOOPBACK_FAILED;  		goto done;  	} @@ -12361,11 +12649,11 @@ static int tg3_test_loopback(struct tg3 *tp, u64 *data, bool do_extlpbk)  		tg3_mac_loopback(tp, true);  		if (tg3_run_loopback(tp, ETH_FRAME_LEN, false)) -			data[0] |= TG3_STD_LOOPBACK_FAILED; +			data[TG3_MAC_LOOPB_TEST] |= TG3_STD_LOOPBACK_FAILED;  		if (tg3_flag(tp, JUMBO_RING_ENABLE) &&  		    tg3_run_loopback(tp, jmb_pkt_sz + ETH_HLEN, false)) -			data[0] |= TG3_JMB_LOOPBACK_FAILED; +			data[TG3_MAC_LOOPB_TEST] |= TG3_JMB_LOOPBACK_FAILED;  		tg3_mac_loopback(tp, false);  	} @@ -12384,13 +12672,13 @@ static int tg3_test_loopback(struct tg3 *tp, u64 *data, bool do_extlpbk)  		}  		if (tg3_run_loopback(tp, ETH_FRAME_LEN, false)) -			data[1] |= TG3_STD_LOOPBACK_FAILED; +			data[TG3_PHY_LOOPB_TEST] |= TG3_STD_LOOPBACK_FAILED;  		if (tg3_flag(tp, TSO_CAPABLE) &&  		    tg3_run_loopback(tp, ETH_FRAME_LEN, true)) -			data[1] |= TG3_TSO_LOOPBACK_FAILED; +			data[TG3_PHY_LOOPB_TEST] |= TG3_TSO_LOOPBACK_FAILED;  		if (tg3_flag(tp, JUMBO_RING_ENABLE) &&  		    tg3_run_loopback(tp, jmb_pkt_sz + ETH_HLEN, false)) -			data[1] |= TG3_JMB_LOOPBACK_FAILED; +			data[TG3_PHY_LOOPB_TEST] |= TG3_JMB_LOOPBACK_FAILED;  		if (do_extlpbk) {  			tg3_phy_lpbk_set(tp, 0, true); @@ -12402,13 +12690,16 @@ static int tg3_test_loopback(struct tg3 *tp, u64 *data, bool do_extlpbk)  			mdelay(40);  			if (tg3_run_loopback(tp, ETH_FRAME_LEN, false)) -				data[2] |= TG3_STD_LOOPBACK_FAILED; +				data[TG3_EXT_LOOPB_TEST] |= +							TG3_STD_LOOPBACK_FAILED;  			if (tg3_flag(tp, TSO_CAPABLE) &&  			    tg3_run_loopback(tp, ETH_FRAME_LEN, true)) -				data[2] |= TG3_TSO_LOOPBACK_FAILED; +				data[TG3_EXT_LOOPB_TEST] |= +							TG3_TSO_LOOPBACK_FAILED;  			if (tg3_flag(tp, JUMBO_RING_ENABLE) &&  			    tg3_run_loopback(tp, jmb_pkt_sz + ETH_HLEN, false)) -				data[2] |= TG3_JMB_LOOPBACK_FAILED; +				data[TG3_EXT_LOOPB_TEST] |= +							TG3_JMB_LOOPBACK_FAILED;  		}  		/* Re-enable gphy autopowerdown. */ @@ -12416,7 +12707,8 @@ static int tg3_test_loopback(struct tg3 *tp, u64 *data, bool do_extlpbk)  			tg3_phy_toggle_apd(tp, true);  	} -	err = (data[0] | data[1] | data[2]) ? -EIO : 0; +	err = (data[TG3_MAC_LOOPB_TEST] | data[TG3_PHY_LOOPB_TEST] | +	       data[TG3_EXT_LOOPB_TEST]) ? -EIO : 0;  done:  	tp->phy_flags |= eee_cap; @@ -12441,11 +12733,11 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,  	if (tg3_test_nvram(tp) != 0) {  		etest->flags |= ETH_TEST_FL_FAILED; -		data[0] = 1; +		data[TG3_NVRAM_TEST] = 1;  	}  	if (!doextlpbk && tg3_test_link(tp)) {  		etest->flags |= ETH_TEST_FL_FAILED; -		data[1] = 1; +		data[TG3_LINK_TEST] = 1;  	}  	if (etest->flags & ETH_TEST_FL_OFFLINE) {  		int err, err2 = 0, irq_sync = 0; @@ -12457,7 +12749,6 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,  		}  		tg3_full_lock(tp, irq_sync); -  		tg3_halt(tp, RESET_KIND_SUSPEND, 1);  		err = tg3_nvram_lock(tp);  		tg3_halt_cpu(tp, RX_CPU_BASE); @@ -12471,25 +12762,25 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,  		if (tg3_test_registers(tp) != 0) {  			etest->flags |= ETH_TEST_FL_FAILED; -			data[2] = 1; +			data[TG3_REGISTER_TEST] = 1;  		}  		if (tg3_test_memory(tp) != 0) {  			etest->flags |= ETH_TEST_FL_FAILED; -			data[3] = 1; +			data[TG3_MEMORY_TEST] = 1;  		}  		if (doextlpbk)  			etest->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE; -		if (tg3_test_loopback(tp, &data[4], doextlpbk)) +		if (tg3_test_loopback(tp, data, doextlpbk))  			etest->flags |= ETH_TEST_FL_FAILED;  		tg3_full_unlock(tp);  		if (tg3_test_interrupt(tp) != 0) {  			etest->flags |= ETH_TEST_FL_FAILED; -			data[7] = 1; +			data[TG3_INTERRUPT_TEST] = 1;  		}  		tg3_full_lock(tp, 0); @@ -12512,6 +12803,96 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,  } +static int tg3_hwtstamp_ioctl(struct net_device *dev, +			      struct ifreq *ifr, int cmd) +{ +	struct tg3 *tp = netdev_priv(dev); +	struct hwtstamp_config stmpconf; + +	if (!tg3_flag(tp, PTP_CAPABLE)) +		return -EINVAL; + +	if (copy_from_user(&stmpconf, ifr->ifr_data, sizeof(stmpconf))) +		return -EFAULT; + +	if (stmpconf.flags) +		return -EINVAL; + +	switch (stmpconf.tx_type) { +	case HWTSTAMP_TX_ON: +		tg3_flag_set(tp, TX_TSTAMP_EN); +		break; +	case HWTSTAMP_TX_OFF: +		tg3_flag_clear(tp, TX_TSTAMP_EN); +		break; +	default: +		return -ERANGE; +	} + +	switch (stmpconf.rx_filter) { +	case HWTSTAMP_FILTER_NONE: +		tp->rxptpctl = 0; +		break; +	case HWTSTAMP_FILTER_PTP_V1_L4_EVENT: +		tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V1_EN | +			       TG3_RX_PTP_CTL_ALL_V1_EVENTS; +		break; +	case HWTSTAMP_FILTER_PTP_V1_L4_SYNC: +		tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V1_EN | +			       TG3_RX_PTP_CTL_SYNC_EVNT; +		break; +	case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ: +		tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V1_EN | +			       TG3_RX_PTP_CTL_DELAY_REQ; +		break; +	case HWTSTAMP_FILTER_PTP_V2_EVENT: +		tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_EN | +			       TG3_RX_PTP_CTL_ALL_V2_EVENTS; +		break; +	case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: +		tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | +			       TG3_RX_PTP_CTL_ALL_V2_EVENTS; +		break; +	case HWTSTAMP_FILTER_PTP_V2_L4_EVENT: +		tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | +			       TG3_RX_PTP_CTL_ALL_V2_EVENTS; +		break; +	case HWTSTAMP_FILTER_PTP_V2_SYNC: +		tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_EN | +			       TG3_RX_PTP_CTL_SYNC_EVNT; +		break; +	case HWTSTAMP_FILTER_PTP_V2_L2_SYNC: +		tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | +			       TG3_RX_PTP_CTL_SYNC_EVNT; +		break; +	case HWTSTAMP_FILTER_PTP_V2_L4_SYNC: +		tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | +			       TG3_RX_PTP_CTL_SYNC_EVNT; +		break; +	case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: +		tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_EN | +			       TG3_RX_PTP_CTL_DELAY_REQ; +		break; +	case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ: +		tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | +			       TG3_RX_PTP_CTL_DELAY_REQ; +		break; +	case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ: +		tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | +			       TG3_RX_PTP_CTL_DELAY_REQ; +		break; +	default: +		return -ERANGE; +	} + +	if (netif_running(dev) && tp->rxptpctl) +		tw32(TG3_RX_PTP_CTL, +		     tp->rxptpctl | TG3_RX_PTP_CTL_HWTS_INTERLOCK); + +	return copy_to_user(ifr->ifr_data, &stmpconf, sizeof(stmpconf)) ? +		-EFAULT : 0; +} +  static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)  {  	struct mii_ioctl_data *data = if_mii(ifr); @@ -12562,6 +12943,9 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)  		return err; +	case SIOCSHWTSTAMP: +		return tg3_hwtstamp_ioctl(dev, ifr, cmd); +  	default:  		/* do nothing */  		break; @@ -12663,7 +13047,7 @@ static const struct ethtool_ops tg3_ethtool_ops = {  	.set_rxfh_indir		= tg3_set_rxfh_indir,  	.get_channels		= tg3_get_channels,  	.set_channels		= tg3_set_channels, -	.get_ts_info		= ethtool_op_get_ts_info, +	.get_ts_info		= tg3_get_ts_info,  };  static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, @@ -12779,7 +13163,7 @@ static const struct net_device_ops tg3_netdev_ops = {  #endif  }; -static void __devinit tg3_get_eeprom_size(struct tg3 *tp) +static void tg3_get_eeprom_size(struct tg3 *tp)  {  	u32 cursize, val, magic; @@ -12813,7 +13197,7 @@ static void __devinit tg3_get_eeprom_size(struct tg3 *tp)  	tp->nvram_size = cursize;  } -static void __devinit tg3_get_nvram_size(struct tg3 *tp) +static void tg3_get_nvram_size(struct tg3 *tp)  {  	u32 val; @@ -12846,7 +13230,7 @@ static void __devinit tg3_get_nvram_size(struct tg3 *tp)  	tp->nvram_size = TG3_NVRAM_SIZE_512KB;  } -static void __devinit tg3_get_nvram_info(struct tg3 *tp) +static void tg3_get_nvram_info(struct tg3 *tp)  {  	u32 nvcfg1; @@ -12897,7 +13281,7 @@ static void __devinit tg3_get_nvram_info(struct tg3 *tp)  	}  } -static void __devinit tg3_nvram_get_pagesize(struct tg3 *tp, u32 nvmcfg1) +static void tg3_nvram_get_pagesize(struct tg3 *tp, u32 nvmcfg1)  {  	switch (nvmcfg1 & NVRAM_CFG1_5752PAGE_SIZE_MASK) {  	case FLASH_5752PAGE_SIZE_256: @@ -12924,7 +13308,7 @@ static void __devinit tg3_nvram_get_pagesize(struct tg3 *tp, u32 nvmcfg1)  	}  } -static void __devinit tg3_get_5752_nvram_info(struct tg3 *tp) +static void tg3_get_5752_nvram_info(struct tg3 *tp)  {  	u32 nvcfg1; @@ -12965,7 +13349,7 @@ static void __devinit tg3_get_5752_nvram_info(struct tg3 *tp)  	}  } -static void __devinit tg3_get_5755_nvram_info(struct tg3 *tp) +static void tg3_get_5755_nvram_info(struct tg3 *tp)  {  	u32 nvcfg1, protect = 0; @@ -13021,7 +13405,7 @@ static void __devinit tg3_get_5755_nvram_info(struct tg3 *tp)  	}  } -static void __devinit tg3_get_5787_nvram_info(struct tg3 *tp) +static void tg3_get_5787_nvram_info(struct tg3 *tp)  {  	u32 nvcfg1; @@ -13059,7 +13443,7 @@ static void __devinit tg3_get_5787_nvram_info(struct tg3 *tp)  	}  } -static void __devinit tg3_get_5761_nvram_info(struct tg3 *tp) +static void tg3_get_5761_nvram_info(struct tg3 *tp)  {  	u32 nvcfg1, protect = 0; @@ -13134,14 +13518,14 @@ static void __devinit tg3_get_5761_nvram_info(struct tg3 *tp)  	}  } -static void __devinit tg3_get_5906_nvram_info(struct tg3 *tp) +static void tg3_get_5906_nvram_info(struct tg3 *tp)  {  	tp->nvram_jedecnum = JEDEC_ATMEL;  	tg3_flag_set(tp, NVRAM_BUFFERED);  	tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;  } -static void __devinit tg3_get_57780_nvram_info(struct tg3 *tp) +static void tg3_get_57780_nvram_info(struct tg3 *tp)  {  	u32 nvcfg1; @@ -13214,7 +13598,7 @@ static void __devinit tg3_get_57780_nvram_info(struct tg3 *tp)  } -static void __devinit tg3_get_5717_nvram_info(struct tg3 *tp) +static void tg3_get_5717_nvram_info(struct tg3 *tp)  {  	u32 nvcfg1; @@ -13292,7 +13676,7 @@ static void __devinit tg3_get_5717_nvram_info(struct tg3 *tp)  		tg3_flag_set(tp, NO_NVRAM_ADDR_TRANS);  } -static void __devinit tg3_get_5720_nvram_info(struct tg3 *tp) +static void tg3_get_5720_nvram_info(struct tg3 *tp)  {  	u32 nvcfg1, nvmpinstrp; @@ -13405,7 +13789,7 @@ static void __devinit tg3_get_5720_nvram_info(struct tg3 *tp)  }  /* Chips other than 5700/5701 use the NVRAM for fetching info. */ -static void __devinit tg3_nvram_init(struct tg3 *tp) +static void tg3_nvram_init(struct tg3 *tp)  {  	tw32_f(GRC_EEPROM_ADDR,  	     (EEPROM_ADDR_FSM_RESET | @@ -13475,7 +13859,7 @@ struct subsys_tbl_ent {  	u32 phy_id;  }; -static struct subsys_tbl_ent subsys_id_to_phy_id[] __devinitdata = { +static struct subsys_tbl_ent subsys_id_to_phy_id[] = {  	/* Broadcom boards. */  	{ TG3PCI_SUBVENDOR_ID_BROADCOM,  	  TG3PCI_SUBDEVICE_ID_BROADCOM_95700A6, TG3_PHY_ID_BCM5401 }, @@ -13539,7 +13923,7 @@ static struct subsys_tbl_ent subsys_id_to_phy_id[] __devinitdata = {  	  TG3PCI_SUBDEVICE_ID_IBM_5703SAX2, 0 }  }; -static struct subsys_tbl_ent * __devinit tg3_lookup_by_subsys(struct tg3 *tp) +static struct subsys_tbl_ent *tg3_lookup_by_subsys(struct tg3 *tp)  {  	int i; @@ -13553,7 +13937,7 @@ static struct subsys_tbl_ent * __devinit tg3_lookup_by_subsys(struct tg3 *tp)  	return NULL;  } -static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) +static void tg3_get_eeprom_hw_cfg(struct tg3 *tp)  {  	u32 val; @@ -13753,7 +14137,7 @@ done:  		device_set_wakeup_capable(&tp->pdev->dev, false);  } -static int __devinit tg3_issue_otp_command(struct tg3 *tp, u32 cmd) +static int tg3_issue_otp_command(struct tg3 *tp, u32 cmd)  {  	int i;  	u32 val; @@ -13776,7 +14160,7 @@ static int __devinit tg3_issue_otp_command(struct tg3 *tp, u32 cmd)   * configuration is a 32-bit value that straddles the alignment boundary.   * We do two 32-bit reads and then shift and merge the results.   */ -static u32 __devinit tg3_read_otp_phycfg(struct tg3 *tp) +static u32 tg3_read_otp_phycfg(struct tg3 *tp)  {  	u32 bhalf_otp, thalf_otp; @@ -13802,7 +14186,7 @@ static u32 __devinit tg3_read_otp_phycfg(struct tg3 *tp)  	return ((thalf_otp & 0x0000ffff) << 16) | (bhalf_otp >> 16);  } -static void __devinit tg3_phy_init_link_config(struct tg3 *tp) +static void tg3_phy_init_link_config(struct tg3 *tp)  {  	u32 adv = ADVERTISED_Autoneg; @@ -13829,7 +14213,7 @@ static void __devinit tg3_phy_init_link_config(struct tg3 *tp)  	tp->old_link = -1;  } -static int __devinit tg3_phy_probe(struct tg3 *tp) +static int tg3_phy_probe(struct tg3 *tp)  {  	u32 hw_phy_id_1, hw_phy_id_2;  	u32 hw_phy_id, hw_phy_id_masked; @@ -13957,7 +14341,7 @@ skip_phy_reset:  	return err;  } -static void __devinit tg3_read_vpd(struct tg3 *tp) +static void tg3_read_vpd(struct tg3 *tp)  {  	u8 *vpd_data;  	unsigned int block_end, rosize, len; @@ -14026,7 +14410,8 @@ out_not_found:  out_no_vpd:  	if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717) { -		if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717) +		if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717 || +		    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717_C)  			strcpy(tp->board_part_number, "BCM5717");  		else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718)  			strcpy(tp->board_part_number, "BCM5718"); @@ -14077,7 +14462,7 @@ nomatch:  	}  } -static int __devinit tg3_fw_img_is_valid(struct tg3 *tp, u32 offset) +static int tg3_fw_img_is_valid(struct tg3 *tp, u32 offset)  {  	u32 val; @@ -14090,7 +14475,7 @@ static int __devinit tg3_fw_img_is_valid(struct tg3 *tp, u32 offset)  	return 1;  } -static void __devinit tg3_read_bc_ver(struct tg3 *tp) +static void tg3_read_bc_ver(struct tg3 *tp)  {  	u32 val, offset, start, ver_offset;  	int i, dst_off; @@ -14142,7 +14527,7 @@ static void __devinit tg3_read_bc_ver(struct tg3 *tp)  	}  } -static void __devinit tg3_read_hwsb_ver(struct tg3 *tp) +static void tg3_read_hwsb_ver(struct tg3 *tp)  {  	u32 val, major, minor; @@ -14158,7 +14543,7 @@ static void __devinit tg3_read_hwsb_ver(struct tg3 *tp)  	snprintf(&tp->fw_ver[0], 32, "sb v%d.%02d", major, minor);  } -static void __devinit tg3_read_sb_ver(struct tg3 *tp, u32 val) +static void tg3_read_sb_ver(struct tg3 *tp, u32 val)  {  	u32 offset, major, minor, build; @@ -14213,7 +14598,7 @@ static void __devinit tg3_read_sb_ver(struct tg3 *tp, u32 val)  	}  } -static void __devinit tg3_read_mgmtfw_ver(struct tg3 *tp) +static void tg3_read_mgmtfw_ver(struct tg3 *tp)  {  	u32 val, offset, start;  	int i, vlen; @@ -14265,7 +14650,7 @@ static void __devinit tg3_read_mgmtfw_ver(struct tg3 *tp)  	}  } -static void __devinit tg3_probe_ncsi(struct tg3 *tp) +static void tg3_probe_ncsi(struct tg3 *tp)  {  	u32 apedata; @@ -14281,7 +14666,7 @@ static void __devinit tg3_probe_ncsi(struct tg3 *tp)  		tg3_flag_set(tp, APE_HAS_NCSI);  } -static void __devinit tg3_read_dash_ver(struct tg3 *tp) +static void tg3_read_dash_ver(struct tg3 *tp)  {  	int vlen;  	u32 apedata; @@ -14304,7 +14689,7 @@ static void __devinit tg3_read_dash_ver(struct tg3 *tp)  		 (apedata & APE_FW_VERSION_BLDMSK));  } -static void __devinit tg3_read_fw_ver(struct tg3 *tp) +static void tg3_read_fw_ver(struct tg3 *tp)  {  	u32 val;  	bool vpd_vers = false; @@ -14357,7 +14742,7 @@ static DEFINE_PCI_DEVICE_TABLE(tg3_write_reorder_chipsets) = {  	{ },  }; -static struct pci_dev * __devinit tg3_find_peer(struct tg3 *tp) +static struct pci_dev *tg3_find_peer(struct tg3 *tp)  {  	struct pci_dev *peer;  	unsigned int func, devnr = tp->pdev->devfn & ~7; @@ -14385,7 +14770,7 @@ static struct pci_dev * __devinit tg3_find_peer(struct tg3 *tp)  	return peer;  } -static void __devinit tg3_detect_asic_rev(struct tg3 *tp, u32 misc_ctrl_reg) +static void tg3_detect_asic_rev(struct tg3 *tp, u32 misc_ctrl_reg)  {  	tp->pci_chip_rev_id = misc_ctrl_reg >> MISC_HOST_CTRL_CHIPREV_SHIFT;  	if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_USE_PROD_ID_REG) { @@ -14397,6 +14782,7 @@ static void __devinit tg3_detect_asic_rev(struct tg3 *tp, u32 misc_ctrl_reg)  		tg3_flag_set(tp, CPMU_PRESENT);  		if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717 || +		    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717_C ||  		    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718 ||  		    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5719 ||  		    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5720) @@ -14424,6 +14810,9 @@ static void __devinit tg3_detect_asic_rev(struct tg3 *tp, u32 misc_ctrl_reg)  	if (tp->pci_chip_rev_id == CHIPREV_ID_5752_A0_HW)  		tp->pci_chip_rev_id = CHIPREV_ID_5752_A0; +	if (tp->pci_chip_rev_id == CHIPREV_ID_5717_C0) +		tp->pci_chip_rev_id = CHIPREV_ID_5720_A0; +  	if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||  	    GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 ||  	    GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720) @@ -14462,7 +14851,29 @@ static void __devinit tg3_detect_asic_rev(struct tg3 *tp, u32 misc_ctrl_reg)  		tg3_flag_set(tp, 5705_PLUS);  } -static int __devinit tg3_get_invariants(struct tg3 *tp) +static bool tg3_10_100_only_device(struct tg3 *tp, +				   const struct pci_device_id *ent) +{ +	u32 grc_misc_cfg = tr32(GRC_MISC_CFG) & GRC_MISC_CFG_BOARD_ID_MASK; + +	if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 && +	    (grc_misc_cfg == 0x8000 || grc_misc_cfg == 0x4000)) || +	    (tp->phy_flags & TG3_PHYFLG_IS_FET)) +		return true; + +	if (ent->driver_data & TG3_DRV_DATA_FLAG_10_100_ONLY) { +		if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { +			if (ent->driver_data & TG3_DRV_DATA_FLAG_5705_10_100) +				return true; +		} else { +			return true; +		} +	} + +	return false; +} + +static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent)  {  	u32 misc_ctrl_reg;  	u32 pci_state_reg, grc_misc_cfg; @@ -15141,22 +15552,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)  	else  		tp->mac_mode = 0; -	/* these are limited to 10/100 only */ -	if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 && -	     (grc_misc_cfg == 0x8000 || grc_misc_cfg == 0x4000)) || -	    (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 && -	     tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM && -	     (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901 || -	      tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901_2 || -	      tp->pdev->device == PCI_DEVICE_ID_TIGON3_5705F)) || -	    (tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM && -	     (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5751F || -	      tp->pdev->device == PCI_DEVICE_ID_TIGON3_5753F || -	      tp->pdev->device == PCI_DEVICE_ID_TIGON3_5787F)) || -	    tp->pdev->device == TG3PCI_DEVICE_TIGON3_57790 || -	    tp->pdev->device == TG3PCI_DEVICE_TIGON3_57791 || -	    tp->pdev->device == TG3PCI_DEVICE_TIGON3_57795 || -	    (tp->phy_flags & TG3_PHYFLG_IS_FET)) +	if (tg3_10_100_only_device(tp, ent))  		tp->phy_flags |= TG3_PHYFLG_10_100_ONLY;  	err = tg3_phy_probe(tp); @@ -15236,7 +15632,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)  }  #ifdef CONFIG_SPARC -static int __devinit tg3_get_macaddr_sparc(struct tg3 *tp) +static int tg3_get_macaddr_sparc(struct tg3 *tp)  {  	struct net_device *dev = tp->dev;  	struct pci_dev *pdev = tp->pdev; @@ -15253,7 +15649,7 @@ static int __devinit tg3_get_macaddr_sparc(struct tg3 *tp)  	return -ENODEV;  } -static int __devinit tg3_get_default_macaddr_sparc(struct tg3 *tp) +static int tg3_get_default_macaddr_sparc(struct tg3 *tp)  {  	struct net_device *dev = tp->dev; @@ -15263,7 +15659,7 @@ static int __devinit tg3_get_default_macaddr_sparc(struct tg3 *tp)  }  #endif -static int __devinit tg3_get_device_address(struct tg3 *tp) +static int tg3_get_device_address(struct tg3 *tp)  {  	struct net_device *dev = tp->dev;  	u32 hi, lo, mac_offset; @@ -15342,7 +15738,7 @@ static int __devinit tg3_get_device_address(struct tg3 *tp)  #define BOUNDARY_SINGLE_CACHELINE	1  #define BOUNDARY_MULTI_CACHELINE	2 -static u32 __devinit tg3_calc_dma_bndry(struct tg3 *tp, u32 val) +static u32 tg3_calc_dma_bndry(struct tg3 *tp, u32 val)  {  	int cacheline_size;  	u8 byte; @@ -15483,7 +15879,8 @@ out:  	return val;  } -static int __devinit tg3_do_test_dma(struct tg3 *tp, u32 *buf, dma_addr_t buf_dma, int size, int to_device) +static int tg3_do_test_dma(struct tg3 *tp, u32 *buf, dma_addr_t buf_dma, +			   int size, int to_device)  {  	struct tg3_internal_buffer_desc test_desc;  	u32 sram_dma_descs; @@ -15570,7 +15967,7 @@ static DEFINE_PCI_DEVICE_TABLE(tg3_dma_wait_state_chipsets) = {  	{ },  }; -static int __devinit tg3_test_dma(struct tg3 *tp) +static int tg3_test_dma(struct tg3 *tp)  {  	dma_addr_t buf_dma;  	u32 *buf, saved_dma_rwctrl; @@ -15760,7 +16157,7 @@ out_nofree:  	return ret;  } -static void __devinit tg3_init_bufmgr_config(struct tg3 *tp) +static void tg3_init_bufmgr_config(struct tg3 *tp)  {  	if (tg3_flag(tp, 57765_PLUS)) {  		tp->bufmgr_config.mbuf_read_dma_low_water = @@ -15816,7 +16213,7 @@ static void __devinit tg3_init_bufmgr_config(struct tg3 *tp)  	tp->bufmgr_config.dma_high_water = DEFAULT_DMA_HIGH_WATER;  } -static char * __devinit tg3_phy_string(struct tg3 *tp) +static char *tg3_phy_string(struct tg3 *tp)  {  	switch (tp->phy_id & TG3_PHY_ID_MASK) {  	case TG3_PHY_ID_BCM5400:	return "5400"; @@ -15847,7 +16244,7 @@ static char * __devinit tg3_phy_string(struct tg3 *tp)  	}  } -static char * __devinit tg3_bus_string(struct tg3 *tp, char *str) +static char *tg3_bus_string(struct tg3 *tp, char *str)  {  	if (tg3_flag(tp, PCI_EXPRESS)) {  		strcpy(str, "PCI Express"); @@ -15883,7 +16280,7 @@ static char * __devinit tg3_bus_string(struct tg3 *tp, char *str)  	return str;  } -static void __devinit tg3_init_coal(struct tg3 *tp) +static void tg3_init_coal(struct tg3 *tp)  {  	struct ethtool_coalesce *ec = &tp->coal; @@ -15914,7 +16311,7 @@ static void __devinit tg3_init_coal(struct tg3 *tp)  	}  } -static int __devinit tg3_init_one(struct pci_dev *pdev, +static int tg3_init_one(struct pci_dev *pdev,  				  const struct pci_device_id *ent)  {  	struct net_device *dev; @@ -16013,6 +16410,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,  	    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761S ||  	    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761SE ||  	    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717 || +	    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717_C ||  	    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718 ||  	    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5719 ||  	    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5720) { @@ -16034,7 +16432,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,  	dev->netdev_ops = &tg3_netdev_ops;  	dev->irq = pdev->irq; -	err = tg3_get_invariants(tp); +	err = tg3_get_invariants(tp, ent);  	if (err) {  		dev_err(&pdev->dev,  			"Problem fetching invariants of chip, aborting\n"); @@ -16209,6 +16607,10 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,  	pci_set_drvdata(pdev, dev); +	if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 || +	    GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720) +		tg3_flag_set(tp, PTP_CAPABLE); +  	if (tg3_flag(tp, 5717_PLUS)) {  		/* Resume a low-power mode */  		tg3_frob_aux_power(tp, false); @@ -16293,7 +16695,7 @@ err_out_disable_pdev:  	return err;  } -static void __devexit tg3_remove_one(struct pci_dev *pdev) +static void tg3_remove_one(struct pci_dev *pdev)  {  	struct net_device *dev = pci_get_drvdata(pdev); @@ -16534,8 +16936,8 @@ static void tg3_io_resume(struct pci_dev *pdev)  	tg3_full_lock(tp, 0);  	tg3_flag_set(tp, INIT_COMPLETE);  	err = tg3_restart_hw(tp, 1); -	tg3_full_unlock(tp);  	if (err) { +		tg3_full_unlock(tp);  		netdev_err(netdev, "Cannot restart hardware after reset.\n");  		goto done;  	} @@ -16546,6 +16948,8 @@ static void tg3_io_resume(struct pci_dev *pdev)  	tg3_netif_start(tp); +	tg3_full_unlock(tp); +  	tg3_phy_start(tp);  done: @@ -16562,7 +16966,7 @@ static struct pci_driver tg3_driver = {  	.name		= DRV_MODULE_NAME,  	.id_table	= tg3_pci_tbl,  	.probe		= tg3_init_one, -	.remove		= __devexit_p(tg3_remove_one), +	.remove		= tg3_remove_one,  	.err_handler	= &tg3_err_handler,  	.driver.pm	= TG3_PM_OPS,  }; diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h index d9308c32102e..d330e81f5793 100644 --- a/drivers/net/ethernet/broadcom/tg3.h +++ b/drivers/net/ethernet/broadcom/tg3.h @@ -44,12 +44,14 @@  #define  TG3PCI_DEVICE_TIGON3_5761S	 0x1688  #define  TG3PCI_DEVICE_TIGON3_5761SE	 0x1689  #define  TG3PCI_DEVICE_TIGON3_57780	 0x1692 +#define  TG3PCI_DEVICE_TIGON3_5787M	 0x1693  #define  TG3PCI_DEVICE_TIGON3_57760	 0x1690  #define  TG3PCI_DEVICE_TIGON3_57790	 0x1694  #define  TG3PCI_DEVICE_TIGON3_57788	 0x1691  #define  TG3PCI_DEVICE_TIGON3_5785_G	 0x1699 /* GPHY */  #define  TG3PCI_DEVICE_TIGON3_5785_F	 0x16a0 /* 10/100 only */  #define  TG3PCI_DEVICE_TIGON3_5717	 0x1655 +#define  TG3PCI_DEVICE_TIGON3_5717_C	 0x1665  #define  TG3PCI_DEVICE_TIGON3_5718	 0x1656  #define  TG3PCI_DEVICE_TIGON3_57781	 0x16b1  #define  TG3PCI_DEVICE_TIGON3_57785	 0x16b5 @@ -95,6 +97,10 @@  #define TG3PCI_SUBDEVICE_ID_COMPAQ_NC7780_2	0x0099  #define TG3PCI_SUBVENDOR_ID_IBM			PCI_VENDOR_ID_IBM  #define TG3PCI_SUBDEVICE_ID_IBM_5703SAX2	0x0281 +#define TG3PCI_SUBDEVICE_ID_ACER_57780_A	0x0601 +#define TG3PCI_SUBDEVICE_ID_ACER_57780_B	0x0612 +#define TG3PCI_SUBDEVICE_ID_LENOVO_5787M	0x3056 +  /* 0x30 --> 0x64 unused */  #define TG3PCI_MSI_DATA			0x00000064  /* 0x66 --> 0x68 unused */ @@ -149,6 +155,7 @@  #define  CHIPREV_ID_57780_A0		 0x57780000  #define  CHIPREV_ID_57780_A1		 0x57780001  #define  CHIPREV_ID_5717_A0		 0x05717000 +#define  CHIPREV_ID_5717_C0		 0x05717200  #define  CHIPREV_ID_57765_A0		 0x57785000  #define  CHIPREV_ID_5719_A0		 0x05719000  #define  CHIPREV_ID_5720_A0		 0x05720000 @@ -765,7 +772,10 @@  #define  SG_DIG_MAC_ACK_STATUS		 0x00000004  #define  SG_DIG_AUTONEG_COMPLETE	 0x00000002  #define  SG_DIG_AUTONEG_ERROR		 0x00000001 -/* 0x5b8 --> 0x600 unused */ +#define TG3_TX_TSTAMP_LSB		0x000005c0 +#define TG3_TX_TSTAMP_MSB		0x000005c4 +#define  TG3_TSTAMP_MASK		 0x7fffffffffffffff +/* 0x5c8 --> 0x600 unused */  #define MAC_TX_MAC_STATE_BASE		0x00000600 /* 16 bytes */  #define MAC_RX_MAC_STATE_BASE		0x00000610 /* 20 bytes */  /* 0x624 --> 0x670 unused */ @@ -782,7 +792,36 @@  #define MAC_RSS_HASH_KEY_7		0x0000068c  #define MAC_RSS_HASH_KEY_8		0x00000690  #define MAC_RSS_HASH_KEY_9		0x00000694 -/* 0x698 --> 0x800 unused */ +/* 0x698 --> 0x6b0 unused */ + +#define TG3_RX_TSTAMP_LSB		0x000006b0 +#define TG3_RX_TSTAMP_MSB		0x000006b4 +/* 0x6b8 --> 0x6c8 unused */ + +#define TG3_RX_PTP_CTL			0x000006c8 +#define TG3_RX_PTP_CTL_SYNC_EVNT	0x00000001 +#define TG3_RX_PTP_CTL_DELAY_REQ	0x00000002 +#define TG3_RX_PTP_CTL_PDLAY_REQ	0x00000004 +#define TG3_RX_PTP_CTL_PDLAY_RES	0x00000008 +#define TG3_RX_PTP_CTL_ALL_V1_EVENTS	(TG3_RX_PTP_CTL_SYNC_EVNT | \ +					 TG3_RX_PTP_CTL_DELAY_REQ) +#define TG3_RX_PTP_CTL_ALL_V2_EVENTS	(TG3_RX_PTP_CTL_SYNC_EVNT | \ +					 TG3_RX_PTP_CTL_DELAY_REQ | \ +					 TG3_RX_PTP_CTL_PDLAY_REQ | \ +					 TG3_RX_PTP_CTL_PDLAY_RES) +#define TG3_RX_PTP_CTL_FOLLOW_UP	0x00000100 +#define TG3_RX_PTP_CTL_DELAY_RES	0x00000200 +#define TG3_RX_PTP_CTL_PDRES_FLW_UP	0x00000400 +#define TG3_RX_PTP_CTL_ANNOUNCE		0x00000800 +#define TG3_RX_PTP_CTL_SIGNALING	0x00001000 +#define TG3_RX_PTP_CTL_MANAGEMENT	0x00002000 +#define TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN	0x00800000 +#define TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN	0x01000000 +#define TG3_RX_PTP_CTL_RX_PTP_V2_EN	(TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | \ +					 TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN) +#define TG3_RX_PTP_CTL_RX_PTP_V1_EN	0x02000000 +#define TG3_RX_PTP_CTL_HWTS_INTERLOCK	0x04000000 +/* 0x6cc --> 0x800 unused */  #define MAC_TX_STATS_OCTETS		0x00000800  #define MAC_TX_STATS_RESV1		0x00000804 @@ -1662,6 +1701,7 @@  #define  GRC_MODE_HOST_STACKUP		0x00010000  #define  GRC_MODE_HOST_SENDBDS		0x00020000  #define  GRC_MODE_HTX2B_ENABLE		0x00040000 +#define  GRC_MODE_TIME_SYNC_ENABLE	0x00080000  #define  GRC_MODE_NO_TX_PHDR_CSUM	0x00100000  #define  GRC_MODE_NVRAM_WR_ENABLE	0x00200000  #define  GRC_MODE_PCIE_TL_SEL		0x00000000 @@ -1764,7 +1804,17 @@  #define GRC_VCPU_EXT_CTRL_DISABLE_WOL	 0x20000000  #define GRC_FASTBOOT_PC			0x00006894	/* 5752, 5755, 5787 */ -/* 0x6c00 --> 0x7000 unused */ +#define TG3_EAV_REF_CLCK_LSB		0x00006900 +#define TG3_EAV_REF_CLCK_MSB		0x00006904 +#define TG3_EAV_REF_CLCK_CTL		0x00006908 +#define  TG3_EAV_REF_CLCK_CTL_STOP	 0x00000002 +#define  TG3_EAV_REF_CLCK_CTL_RESUME	 0x00000004 +#define TG3_EAV_REF_CLK_CORRECT_CTL	0x00006928 +#define  TG3_EAV_REF_CLK_CORRECT_EN	 (1 << 31) +#define  TG3_EAV_REF_CLK_CORRECT_NEG	 (1 << 30) + +#define TG3_EAV_REF_CLK_CORRECT_MASK	0xffffff +/* 0x690c --> 0x7000 unused */  /* NVRAM Control registers */  #define NVRAM_CMD			0x00007000 @@ -2432,6 +2482,7 @@ struct tg3_tx_buffer_desc {  #define TXD_FLAG_IP_FRAG		0x0008  #define TXD_FLAG_JMB_PKT		0x0008  #define TXD_FLAG_IP_FRAG_END		0x0010 +#define TXD_FLAG_HWTSTAMP		0x0020  #define TXD_FLAG_VLAN			0x0040  #define TXD_FLAG_COAL_NOW		0x0080  #define TXD_FLAG_CPU_PRE_DMA		0x0100 @@ -2473,6 +2524,9 @@ struct tg3_rx_buffer_desc {  #define RXD_FLAG_IP_CSUM		0x1000  #define RXD_FLAG_TCPUDP_CSUM		0x2000  #define RXD_FLAG_IS_TCP			0x4000 +#define RXD_FLAG_PTPSTAT_MASK		0x0210 +#define RXD_FLAG_PTPSTAT_PTPV1		0x0010 +#define RXD_FLAG_PTPSTAT_PTPV2		0x0200  	u32				ip_tcp_csum;  #define RXD_IPCSUM_MASK		0xffff0000 @@ -2963,9 +3017,11 @@ enum TG3_FLAGS {  	TG3_FLAG_USE_JUMBO_BDFLAG,  	TG3_FLAG_L1PLLPD_EN,  	TG3_FLAG_APE_HAS_NCSI, +	TG3_FLAG_TX_TSTAMP_EN,  	TG3_FLAG_4K_FIFO_LIMIT,  	TG3_FLAG_5719_RDMA_BUG,  	TG3_FLAG_RESET_TASK_PENDING, +	TG3_FLAG_PTP_CAPABLE,  	TG3_FLAG_5705_PLUS,  	TG3_FLAG_IS_5788,  	TG3_FLAG_5750_PLUS, @@ -3034,6 +3090,10 @@ struct tg3 {  	u32				coal_now;  	u32				msg_enable; +	struct ptp_clock_info		ptp_info; +	struct ptp_clock		*ptp_clock; +	s64				ptp_adjust; +  	/* begin "tx thread" cacheline section */  	void				(*write32_tx_mbox) (struct tg3 *, u32,  							    u32); @@ -3101,6 +3161,7 @@ struct tg3 {  	u32				dma_rwctrl;  	u32				coalesce_mode;  	u32				pwrmgmt_thresh; +	u32				rxptpctl;  	/* PCI block */  	u32				pci_chip_rev_id; @@ -3262,6 +3323,7 @@ struct tg3 {  #if IS_ENABLED(CONFIG_HWMON)  	struct device			*hwmon_dev;  #endif +	bool				link_up;  };  #endif /* !(_T3_H) */ |