netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH][0/4] b44: Cleanup and bcm47xx support
@ 2004-08-29 20:17 Florian Schirmer
  2004-08-29 20:33 ` [PATCH][1/4] b44: Ignore carrier lost errors Florian Schirmer
                   ` (4 more replies)
  0 siblings, 5 replies; 18+ messages in thread
From: Florian Schirmer @ 2004-08-29 20:17 UTC (permalink / raw)
  To: Pekka Pietikainen, jgarzik; +Cc: linux-kernel, netdev

[-- Attachment #1: Type: text/plain, Size: 532 bytes --]

Hi,

here is the second try to add bcm47xx support to the b44 driver. Changes since 
the first version:

- Splitted the patch into logical hunks
- Ignore carrier lost errors (buggy hardware)
- Added CAM read support
- Read MAC from CAM instead of hardcoding a dummy MAC into the driver
- Use a special PHY address (0x30) to indicate that there is no PHY (this is 
compatible with the Broadcom et and 4401 driver)
- Added MDIO value calculation based on the backplane speed

Comments welcome!

Regards,
   Florian


[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH][1/4] b44: Ignore carrier lost errors
  2004-08-29 20:17 [PATCH][0/4] b44: Cleanup and bcm47xx support Florian Schirmer
@ 2004-08-29 20:33 ` Florian Schirmer
  2004-08-29 20:49   ` Jeff Garzik
  2004-09-17 15:54   ` Jeff Garzik
  2004-08-29 20:34 ` [PATCH][2/4] b44: Cleanup SiliconBackplane definitions/functions Florian Schirmer
                   ` (3 subsequent siblings)
  4 siblings, 2 replies; 18+ messages in thread
From: Florian Schirmer @ 2004-08-29 20:33 UTC (permalink / raw)
  To: Pekka Pietikainen; +Cc: jgarzik, linux-kernel, netdev

[-- Attachment #1: Type: text/plain, Size: 805 bytes --]

Hi,

some (?) hardware seems to be buggy and is reporting bogus carrier lost 
values. Both reference implementations from Broadcom indicate that this 
counter is not reliable and therefore ignore it. We should do the same. 
"Fixes" the carrier lost problem i've seen.

Regards,
  Florian

Signed-off-by: Florian Schirmer <jolt@tuxbox.org>

--- linux/drivers/net/b44.c-old1 2004-08-29 16:29:08.000000000 +0200
+++ linux/drivers/net/b44.c 2004-08-29 16:27:00.000000000 +0200
@@ -1347,7 +1347,10 @@ static struct net_device_stats *b44_get_
        hwstat->rx_symbol_errs);
 
  nstat->tx_aborted_errors = hwstat->tx_underruns;
+#if 0
+ /* Carrier lost counter seems to be broken for some devices */
  nstat->tx_carrier_errors = hwstat->tx_carrier_lost;
+#endif
 
  return nstat;
 }


[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH][2/4] b44: Cleanup SiliconBackplane definitions/functions
  2004-08-29 20:17 [PATCH][0/4] b44: Cleanup and bcm47xx support Florian Schirmer
  2004-08-29 20:33 ` [PATCH][1/4] b44: Ignore carrier lost errors Florian Schirmer
@ 2004-08-29 20:34 ` Florian Schirmer
  2004-09-17 15:55   ` Jeff Garzik
  2004-08-29 20:36 ` [PATCH][3/4] b44: Add support for PHY-less cards Florian Schirmer
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 18+ messages in thread
From: Florian Schirmer @ 2004-08-29 20:34 UTC (permalink / raw)
  To: Pekka Pietikainen; +Cc: jgarzik, linux-kernel, netdev

[-- Attachment #1: Type: text/plain, Size: 9453 bytes --]

Hi,

there is a good amount of code to support SiliconBackplane functions which are unneeded or simply plain wrong. Lets get rid of it.

Regards,
  Florian

Signed-off-by: Florian Schirmer <jolt@tuxbox.org>

--- linux/drivers/net/b44.c-old2 2004-08-29 16:27:00.000000000 +0200
+++ linux/drivers/net/b44.c 2004-08-29 16:59:24.000000000 +0200
@@ -130,41 +130,8 @@ static int b44_wait_bit(struct b44 *bp, 
  * interrupts disabled.
  */
 
-#define SBID_SDRAM  0
-#define SBID_PCI_MEM  1
-#define SBID_PCI_CFG  2
-#define SBID_PCI_DMA  3
-#define SBID_SDRAM_SWAPPED 4
-#define SBID_ENUM  5
-#define SBID_REG_SDRAM  6
-#define SBID_REG_ILINE20 7
-#define SBID_REG_EMAC  8
-#define SBID_REG_CODEC  9
-#define SBID_REG_USB  10
-#define SBID_REG_PCI  11
-#define SBID_REG_MIPS  12
-#define SBID_REG_EXTIF  13
-#define SBID_EXTIF  14
-#define SBID_EJTAG  15
-#define SBID_MAX  16
-
-static u32 ssb_get_addr(struct b44 *bp, u32 id, u32 instance)
-{
- switch (id) {
- case SBID_PCI_DMA:
-  return 0x40000000;
- case SBID_ENUM:
-  return 0x18000000;
- case SBID_REG_EMAC:
-  return 0x18000000;
- case SBID_REG_CODEC:
-  return 0x18001000;
- case SBID_REG_PCI:
-  return 0x18002000;
- default:
-  return 0;
- };
-}
+#define SB_PCI_DMA             0x40000000      /* Client Mode PCI memory access space (1 GB) */
+#define BCM4400_PCI_CORE_ADDR  0x18002000      /* Address of PCI core on BCM4400 cards */
 
 static u32 ssb_get_core_rev(struct b44 *bp)
 {
@@ -176,8 +143,7 @@ static u32 ssb_pci_setup(struct b44 *bp,
  u32 bar_orig, pci_rev, val;
 
  pci_read_config_dword(bp->pdev, SSB_BAR0_WIN, &bar_orig);
- pci_write_config_dword(bp->pdev, SSB_BAR0_WIN,
-          ssb_get_addr(bp, SBID_REG_PCI, 0));
+ pci_write_config_dword(bp->pdev, SSB_BAR0_WIN, BCM4400_PCI_CORE_ADDR);
  pci_rev = ssb_get_core_rev(bp);
 
  val = br32(B44_SBINTVEC);
@@ -1676,7 +1642,6 @@ static int __devinit b44_get_invariants(
  bp->dev->dev_addr[5] = eeprom[82];
 
  bp->phy_addr = eeprom[90] & 0x1f;
- bp->mdc_port = (eeprom[90] >> 14) & 0x1;
 
  /* With this, plus the rx_header prepended to the data by the
   * hardware, we'll land the ethernet header on a 2-byte boundary.
@@ -1686,7 +1651,7 @@ static int __devinit b44_get_invariants(
  bp->imask = IMASK_DEF;
 
  bp->core_unit = ssb_core_unit(bp);
- bp->dma_offset = ssb_get_addr(bp, SBID_PCI_DMA, 0);
+ bp->dma_offset = SB_PCI_DMA;
 
  /* XXX - really required? 
     bp->flags |= B44_FLAG_BUGGY_TXPTR;
--- linux/drivers/net/b44.h-old2 2004-08-29 16:25:36.000000000 +0200
+++ linux/drivers/net/b44.h 2004-08-29 17:06:44.000000000 +0200
@@ -223,21 +223,8 @@
 #define B44_RX_SYM 0x05D0UL /* MIB RX Symbol Errors */
 #define B44_RX_PAUSE 0x05D4UL /* MIB RX Pause Packets */
 #define B44_RX_NPAUSE 0x05D8UL /* MIB RX Non-Pause Packets */
-#define B44_SBIPSFLAG 0x0F08UL /* SB Initiator Port OCP Slave Flag */
-#define  SBIPSFLAG_IMASK1 0x0000003f /* Which sbflags --> mips interrupt 1 */
-#define  SBIPSFLAG_ISHIFT1 0
-#define  SBIPSFLAG_IMASK2 0x00003f00 /* Which sbflags --> mips interrupt 2 */
-#define  SBIPSFLAG_ISHIFT2 8
-#define  SBIPSFLAG_IMASK3 0x003f0000 /* Which sbflags --> mips interrupt 3 */
-#define  SBIPSFLAG_ISHIFT3 16
-#define  SBIPSFLAG_IMASK4 0x3f000000 /* Which sbflags --> mips interrupt 4 */
-#define  SBIPSFLAG_ISHIFT4 24
-#define B44_SBTPSFLAG 0x0F18UL /* SB Target Port OCP Slave Flag */
-#define  SBTPS_NUM0_MASK 0x0000003f
-#define  SBTPS_F0EN0  0x00000040
-#define B44_SBADMATCH3 0x0F60UL /* SB Address Match 3 */
-#define B44_SBADMATCH2 0x0F68UL /* SB Address Match 2 */
-#define B44_SBADMATCH1 0x0F70UL /* SB Address Match 1 */
+
+/* Silicon backplane register definitions */
 #define B44_SBIMSTATE 0x0F90UL /* SB Initiator Agent State */
 #define  SBIMSTATE_PC  0x0000000f /* Pipe Count */
 #define  SBIMSTATE_AP_MASK 0x00000030 /* Arbitration Priority */
@@ -269,86 +256,6 @@
 #define  SBTMSHIGH_GCR  0x20000000 /* Gated Clock Request */
 #define  SBTMSHIGH_BISTF 0x40000000 /* BIST Failed */
 #define  SBTMSHIGH_BISTD 0x80000000 /* BIST Done */
-#define B44_SBBWA0 0x0FA0UL /* SB Bandwidth Allocation Table 0 */
-#define  SBBWA0_TAB0_MASK 0x0000ffff /* Lookup Table 0 */
-#define  SBBWA0_TAB0_SHIFT 0
-#define  SBBWA0_TAB1_MASK 0xffff0000 /* Lookup Table 0 */
-#define  SBBWA0_TAB1_SHIFT 16
-#define B44_SBIMCFGLOW 0x0FA8UL /* SB Initiator Configuration Low */
-#define  SBIMCFGLOW_STO_MASK 0x00000003 /* Service Timeout */
-#define  SBIMCFGLOW_RTO_MASK 0x00000030 /* Request Timeout */
-#define  SBIMCFGLOW_RTO_SHIFT 4
-#define  SBIMCFGLOW_CID_MASK 0x00ff0000 /* Connection ID */
-#define  SBIMCFGLOW_CID_SHIFT 16
-#define B44_SBIMCFGHIGH 0x0FACUL /* SB Initiator Configuration High */
-#define  SBIMCFGHIGH_IEM_MASK 0x0000000c /* Inband Error Mode */
-#define  SBIMCFGHIGH_TEM_MASK 0x00000030 /* Timeout Error Mode */
-#define  SBIMCFGHIGH_TEM_SHIFT 4
-#define  SBIMCFGHIGH_BEM_MASK 0x000000c0 /* Bus Error Mode */
-#define  SBIMCFGHIGH_BEM_SHIFT 6
-#define B44_SBADMATCH0 0x0FB0UL /* SB Address Match 0 */
-#define  SBADMATCH0_TYPE_MASK 0x00000003 /* Address Type */
-#define  SBADMATCH0_AD64 0x00000004 /* Reserved */
-#define  SBADMATCH0_AI0_MASK 0x000000f8 /* Type0 Size */
-#define  SBADMATCH0_AI0_SHIFT 3
-#define  SBADMATCH0_AI1_MASK 0x000001f8 /* Type1 Size */
-#define  SBADMATCH0_AI1_SHIFT 3
-#define  SBADMATCH0_AI2_MASK 0x000001f8 /* Type2 Size */
-#define  SBADMATCH0_AI2_SHIFT 3
-#define  SBADMATCH0_ADEN 0x00000400 /* Enable */
-#define  SBADMATCH0_ADNEG 0x00000800 /* Negative Decode */
-#define  SBADMATCH0_BS0_MASK 0xffffff00 /* Type0 Base Address */
-#define  SBADMATCH0_BS0_SHIFT 8
-#define  SBADMATCH0_BS1_MASK 0xfffff000 /* Type1 Base Address */
-#define  SBADMATCH0_BS1_SHIFT 12
-#define  SBADMATCH0_BS2_MASK 0xffff0000 /* Type2 Base Address */
-#define  SBADMATCH0_BS2_SHIFT 16
-#define B44_SBTMCFGLOW 0x0FB8UL /* SB Target Configuration Low */
-#define  SBTMCFGLOW_CD_MASK 0x000000ff /* Clock Divide Mask */
-#define  SBTMCFGLOW_CO_MASK 0x0000f800 /* Clock Offset Mask */
-#define  SBTMCFGLOW_CO_SHIFT 11
-#define  SBTMCFGLOW_IF_MASK 0x00fc0000 /* Interrupt Flags Mask */
-#define  SBTMCFGLOW_IF_SHIFT 18
-#define  SBTMCFGLOW_IM_MASK 0x03000000 /* Interrupt Mode Mask */
-#define  SBTMCFGLOW_IM_SHIFT 24
-#define B44_SBTMCFGHIGH 0x0FBCUL /* SB Target Configuration High */
-#define  SBTMCFGHIGH_BM_MASK 0x00000003 /* Busy Mode */
-#define  SBTMCFGHIGH_RM_MASK 0x0000000C /* Retry Mode */
-#define  SBTMCFGHIGH_RM_SHIFT 2
-#define  SBTMCFGHIGH_SM_MASK 0x00000030 /* Stop Mode */
-#define  SBTMCFGHIGH_SM_SHIFT 4
-#define  SBTMCFGHIGH_EM_MASK 0x00000300 /* Error Mode */
-#define  SBTMCFGHIGH_EM_SHIFT 8
-#define  SBTMCFGHIGH_IM_MASK 0x00000c00 /* Interrupt Mode */
-#define  SBTMCFGHIGH_IM_SHIFT 10
-#define B44_SBBCFG 0x0FC0UL /* SB Broadcast Configuration */
-#define  SBBCFG_LAT_MASK 0x00000003 /* SB Latency */
-#define  SBBCFG_MAX0_MASK 0x000f0000 /* MAX Counter 0 */
-#define  SBBCFG_MAX0_SHIFT 16
-#define  SBBCFG_MAX1_MASK 0x00f00000 /* MAX Counter 1 */
-#define  SBBCFG_MAX1_SHIFT 20
-#define B44_SBBSTATE 0x0FC8UL /* SB Broadcast State */
-#define  SBBSTATE_SRD  0x00000001 /* ST Reg Disable */
-#define  SBBSTATE_HRD  0x00000002 /* Hold Reg Disable */
-#define B44_SBACTCNFG 0x0FD8UL /* SB Activate Configuration */
-#define B44_SBFLAGST 0x0FE8UL /* SB Current SBFLAGS */
-#define B44_SBIDLOW 0x0FF8UL /* SB Identification Low */
-#define  SBIDLOW_CS_MASK 0x00000003 /* Config Space Mask */
-#define  SBIDLOW_AR_MASK 0x00000038 /* Num Address Ranges Supported */
-#define  SBIDLOW_AR_SHIFT 3
-#define  SBIDLOW_SYNCH  0x00000040 /* Sync */
-#define  SBIDLOW_INIT  0x00000080 /* Initiator */
-#define  SBIDLOW_MINLAT_MASK 0x00000f00 /* Minimum Backplane Latency */
-#define  SBIDLOW_MINLAT_SHIFT 8
-#define  SBIDLOW_MAXLAT_MASK 0x0000f000 /* Maximum Backplane Latency */
-#define  SBIDLOW_MAXLAT_SHIFT 12
-#define  SBIDLOW_FIRST  0x00010000 /* This Initiator is First */
-#define  SBIDLOW_CW_MASK 0x000c0000 /* Cycle Counter Width */
-#define  SBIDLOW_CW_SHIFT 18
-#define  SBIDLOW_TP_MASK 0x00f00000 /* Target Ports */
-#define  SBIDLOW_TP_SHIFT 20
-#define  SBIDLOW_IP_MASK 0x0f000000 /* Initiator Ports */
-#define  SBIDLOW_IP_SHIFT 24
 #define B44_SBIDHIGH 0x0FFCUL /* SB Identification High */
 #define  SBIDHIGH_RC_MASK 0x0000000f /* Revision Code */
 #define  SBIDHIGH_CC_MASK 0x0000fff0 /* Core Code */
@@ -356,23 +263,13 @@
 #define  SBIDHIGH_VC_MASK 0xffff0000 /* Vendor Code */
 #define  SBIDHIGH_VC_SHIFT 16
 
-#define  CORE_CODE_ILINE20 0x801
-#define  CORE_CODE_SDRAM 0x803
-#define  CORE_CODE_PCI  0x804
-#define  CORE_CODE_MIPS  0x805
-#define  CORE_CODE_ENET  0x806
-#define  CORE_CODE_CODEC 0x807
-#define  CORE_CODE_USB  0x808
-#define  CORE_CODE_ILINE100 0x80a
-#define  CORE_CODE_EXTIF 0x811
-
 /* SSB PCI config space registers.  */
 #define SSB_BAR0_WIN  0x80
 #define SSB_BAR1_WIN  0x84
 #define SSB_SPROM_CONTROL 0x88
 #define SSB_BAR1_CONTROL 0x8c
 
-/* SSB core and hsot control registers.  */
+/* SSB core and host control registers.  */
 #define SSB_CONTROL  0x0000UL
 #define SSB_ARBCONTROL  0x0010UL
 #define SSB_ISTAT  0x0020UL
@@ -540,7 +437,6 @@ struct b44 {
  u32   tx_pending;
  u32   pci_cfg_state[64 / sizeof(u32)];
  u8   phy_addr;
- u8   mdc_port;
  u8   core_unit;
 
  struct mii_if_info mii_if;


[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH][3/4] b44: Add support for PHY-less cards
  2004-08-29 20:17 [PATCH][0/4] b44: Cleanup and bcm47xx support Florian Schirmer
  2004-08-29 20:33 ` [PATCH][1/4] b44: Ignore carrier lost errors Florian Schirmer
  2004-08-29 20:34 ` [PATCH][2/4] b44: Cleanup SiliconBackplane definitions/functions Florian Schirmer
@ 2004-08-29 20:36 ` Florian Schirmer
  2004-08-29 20:39 ` [PATCH][4/4] b44: Add bcm47xx support Florian Schirmer
  2004-09-13 23:30 ` [PATCH] Fix for b44 warnings Stephen Hemminger
  4 siblings, 0 replies; 18+ messages in thread
From: Florian Schirmer @ 2004-08-29 20:36 UTC (permalink / raw)
  To: Pekka Pietikainen; +Cc: jgarzik, linux-kernel, netdev

[-- Attachment #1: Type: text/plain, Size: 2434 bytes --]

Hi,

add support for PHY-less cards by using a special magic PHY address. This is compatible with the way Broadcom drivers handle that. We don't have to waste a flags bit for that.

Regards,
   Florian

Signed-off-by: Florian Schirmer <jolt@tuxbox.org>

--- linux/drivers/net/b44.c-old3 2004-08-29 16:59:24.000000000 +0200
+++ linux/drivers/net/b44.c 2004-08-29 17:24:23.000000000 +0200
@@ -273,6 +273,9 @@ static int b44_readphy(struct b44 *bp, i
 {
  int err;
 
+ if (bp->phy_addr == B44_PHY_ADDR_NO_PHY)
+  return 0;
+
  bw32(B44_EMAC_ISTAT, EMAC_INT_MII);
  bw32(B44_MDIO_DATA, (MDIO_DATA_SB_START |
         (MDIO_OP_READ << MDIO_DATA_OP_SHIFT) |
@@ -287,6 +290,9 @@ static int b44_readphy(struct b44 *bp, i
 
 static int b44_writephy(struct b44 *bp, int reg, u32 val)
 {
+ if (bp->phy_addr == B44_PHY_ADDR_NO_PHY)
+  return 0;
+
  bw32(B44_EMAC_ISTAT, EMAC_INT_MII);
  bw32(B44_MDIO_DATA, (MDIO_DATA_SB_START |
         (MDIO_OP_WRITE << MDIO_DATA_OP_SHIFT) |
@@ -325,6 +331,9 @@ static int b44_phy_reset(struct b44 *bp)
  u32 val;
  int err;
 
+ if (bp->phy_addr == B44_PHY_ADDR_NO_PHY)
+  return 0;
+
  err = b44_writephy(bp, MII_BMCR, BMCR_RESET);
  if (err)
   return err;
@@ -395,6 +404,9 @@ static int b44_setup_phy(struct b44 *bp)
  u32 val;
  int err;
 
+ if (bp->phy_addr == B44_PHY_ADDR_NO_PHY)
+  return 0;
+
  if ((err = b44_readphy(bp, B44_MII_ALEDCTRL, &val)) != 0)
   goto out;
  if ((err = b44_writephy(bp, B44_MII_ALEDCTRL,
@@ -487,6 +499,19 @@ static void b44_check_phy(struct b44 *bp
 {
  u32 bmsr, aux;
 
+ if (bp->phy_addr == B44_PHY_ADDR_NO_PHY) {
+  bp->flags |= B44_FLAG_100_BASE_T;
+  bp->flags |= B44_FLAG_FULL_DUPLEX;
+  if (!netif_carrier_ok(bp->dev)) {
+   u32 val = br32(B44_TX_CTRL);
+   val |= TX_CTRL_DUPLEX;
+   bw32(B44_TX_CTRL, val);
+   netif_carrier_on(bp->dev);
+   b44_link_report(bp);
+  }
+  return;
+ }
+
  if (!b44_readphy(bp, MII_BMSR, &bmsr) &&
      !b44_readphy(bp, B44_MII_AUXCTRL, &aux) &&
      (bmsr != 0xffff)) {
--- linux/drivers/net/b44.h-old3 2004-08-29 17:06:44.000000000 +0200
+++ linux/drivers/net/b44.h 2004-08-29 17:24:53.000000000 +0200
@@ -362,6 +362,7 @@ struct ring_info {
 };
 
 #define B44_MCAST_TABLE_SIZE 32
+#define B44_PHY_ADDR_NO_PHY 30
 
 /* SW copy of device statistics, kept up to date by periodic timer
  * which probes HW values.  Must have same relative layout as HW


[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH][4/4] b44: Add bcm47xx support
  2004-08-29 20:17 [PATCH][0/4] b44: Cleanup and bcm47xx support Florian Schirmer
                   ` (2 preceding siblings ...)
  2004-08-29 20:36 ` [PATCH][3/4] b44: Add support for PHY-less cards Florian Schirmer
@ 2004-08-29 20:39 ` Florian Schirmer
  2004-09-13 23:30 ` [PATCH] Fix for b44 warnings Stephen Hemminger
  4 siblings, 0 replies; 18+ messages in thread
From: Florian Schirmer @ 2004-08-29 20:39 UTC (permalink / raw)
  To: Pekka Pietikainen; +Cc: jgarzik, linux-kernel, netdev

[-- Attachment #1: Type: text/plain, Size: 6957 bytes --]

Hi,

finally add bcm47xx support using the infrastructure created by the earlier patches.

Regards,
   Florian

Signed-off-by: Florian Schirmer <jolt@tuxbox.org>


--- linux/drivers/net/b44.c-old4 2004-08-29 17:24:23.000000000 +0200
+++ linux/drivers/net/b44.c 2004-08-29 18:48:45.000000000 +0200
@@ -1,7 +1,8 @@
-/* b44.c: Broadcom 4400 device driver.
+/* b44.c: Broadcom 4400/47xx device driver.
  *
  * Copyright (C) 2002 David S. Miller (davem@redhat.com)
- * Fixed by Pekka Pietikainen (pp@ee.oulu.fi)
+ * Copyright (C) 2004 Pekka Pietikainen (pp@ee.oulu.fi)
+ * Copyright (C) 2004 Florian Schirmer (jolt@tuxbox.org)
  *
  * Distribute under GPL.
  */
@@ -75,7 +76,7 @@ static char version[] __devinitdata =
  DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
 
 MODULE_AUTHOR("David S. Miller (davem@redhat.com)");
-MODULE_DESCRIPTION("Broadcom 4400 10/100 PCI ethernet driver");
+MODULE_DESCRIPTION("Broadcom 4400/47xx 10/100 PCI ethernet driver");
 MODULE_LICENSE("GPL");
 MODULE_PARM(b44_debug, "i");
 MODULE_PARM_DESC(b44_debug, "B44 bitmapped debugging message enable value");
@@ -89,6 +90,8 @@ static struct pci_device_id b44_pci_tbl[
    PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
  { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401B1,
    PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
+ { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4713,
+   PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
  { } /* terminate list with empty entry */
 };
 
@@ -202,29 +205,14 @@ static void ssb_core_reset(struct b44 *b
  udelay(1);
 }
 
+static int b44_4713_instance;
+
 static int ssb_core_unit(struct b44 *bp)
 {
-#if 0
- u32 val = br32(B44_SBADMATCH0);
- u32 base;
-
- type = val & SBADMATCH0_TYPE_MASK;
- switch (type) {
- case 0:
-  base = val & SBADMATCH0_BS0_MASK;
-  break;
-
- case 1:
-  base = val & SBADMATCH0_BS1_MASK;
-  break;
-
- case 2:
- default:
-  base = val & SBADMATCH0_BS2_MASK;
-  break;
- };
-#endif
- return 0;
+ if (bp->pdev->device == PCI_DEVICE_ID_BCM4713)
+  return b44_4713_instance++;
+ else
+  return 0;
 }
 
 static int ssb_is_core_up(struct b44 *bp)
@@ -233,6 +221,28 @@ static int ssb_is_core_up(struct b44 *bp
   == SBTMSLOW_CLOCK);
 }
 
+static void __b44_cam_read(struct b44 *bp, unsigned char *data, int index)
+{
+ u32 val;
+
+ bw32(B44_CAM_CTRL, (CAM_CTRL_READ |
+       (index << CAM_CTRL_INDEX_SHIFT)));
+
+ b44_wait_bit(bp, B44_CAM_CTRL, CAM_CTRL_BUSY, 100, 1); 
+
+ val = br32(B44_CAM_DATA_LO);
+
+ data[2] = (val >> 24) & 0xFF;
+ data[3] = (val >> 16) & 0xFF;
+ data[4] = (val >> 8) & 0xFF;
+ data[5] = (val >> 0) & 0xFF;
+
+ val = br32(B44_CAM_DATA_HI);
+ 
+ data[0] = (val >> 8) & 0xFF;
+ data[1] = (val >> 0) & 0xFF;
+}
+
 static void __b44_cam_write(struct b44 *bp, unsigned char *data, int index)
 {
  u32 val;
@@ -1110,6 +1120,8 @@ static void b44_clear_stats(struct b44 *
 /* bp->lock is held. */
 static void b44_chip_reset(struct b44 *bp)
 {
+ unsigned int sb_clock;
+
  if (ssb_is_core_up(bp)) {
   bw32(B44_RCV_LAZY, 0);
   bw32(B44_ENET_CTRL, ENET_CTRL_DISABLE);
@@ -1123,9 +1135,10 @@ static void b44_chip_reset(struct b44 *b
   bw32(B44_DMARX_CTRL, 0);
   bp->rx_prod = bp->rx_cons = 0;
  } else {
-  ssb_pci_setup(bp, (bp->core_unit == 0 ?
-       SBINTVEC_ENET0 :
-       SBINTVEC_ENET1));
+  if (bp->pdev->device != PCI_DEVICE_ID_BCM4713)
+   ssb_pci_setup(bp, (bp->core_unit == 0 ?
+        SBINTVEC_ENET0 :
+        SBINTVEC_ENET1));
  }
 
  ssb_core_reset(bp);
@@ -1133,8 +1146,14 @@ static void b44_chip_reset(struct b44 *b
  b44_clear_stats(bp);
 
  /* Make PHY accessible. */
+ if (bp->pdev->device == PCI_DEVICE_ID_BCM4713)
+  sb_clock = 100000000; /* 100 MHz */
+ else
+  sb_clock = 62500000; /* 62.5 MHz */
+
  bw32(B44_MDIO_CTRL, (MDIO_CTRL_PREAMBLE |
-        (0x0d & MDIO_CTRL_MAXF_MASK)));
+        (((sb_clock + (B44_MDC_RATIO / 2)) / B44_MDC_RATIO)
+        & MDIO_CTRL_MAXF_MASK)));
  br32(B44_MDIO_CTRL);
 
  if (!(br32(B44_DEVCTRL) & DEVCTRL_IPP)) {
@@ -1654,19 +1673,41 @@ static int __devinit b44_get_invariants(
 {
  u8 eeprom[128];
  int err;
+ unsigned long flags;
 
- err = b44_read_eeprom(bp, &eeprom[0]);
- if (err)
-  goto out;
-
- bp->dev->dev_addr[0] = eeprom[79];
- bp->dev->dev_addr[1] = eeprom[78];
- bp->dev->dev_addr[2] = eeprom[81];
- bp->dev->dev_addr[3] = eeprom[80];
- bp->dev->dev_addr[4] = eeprom[83];
- bp->dev->dev_addr[5] = eeprom[82];
-
- bp->phy_addr = eeprom[90] & 0x1f;
+ if (bp->pdev->device == PCI_DEVICE_ID_BCM4713) {
+  /* 
+   * BCM47xx boards don't have a EEPROM. The MAC is stored in
+   * a NVRAM area somewhere in the flash memory. As we don't
+   * know the location and/or the format of the NVRAM area
+   * here, we simply rely on the bootloader to write the
+   * MAC into the CAM.
+   */
+  spin_lock_irqsave(&bp->lock, flags);
+  __b44_cam_read(bp, bp->dev->dev_addr, 0);
+  spin_unlock_irqrestore(&bp->lock, flags);
+
+  /* 
+   * BCM47xx boards don't have a PHY. Usually there is a switch
+   * chip with multiple PHYs connected to the PHY port.
+   */
+  bp->phy_addr = B44_PHY_ADDR_NO_PHY;
+  bp->dma_offset = 0;
+ } else {
+  err = b44_read_eeprom(bp, &eeprom[0]);
+  if (err)
+   return err;
+
+  bp->dev->dev_addr[0] = eeprom[79];
+  bp->dev->dev_addr[1] = eeprom[78];
+  bp->dev->dev_addr[2] = eeprom[81];
+  bp->dev->dev_addr[3] = eeprom[80];
+  bp->dev->dev_addr[4] = eeprom[83];
+  bp->dev->dev_addr[5] = eeprom[82];
+
+  bp->phy_addr = eeprom[90] & 0x1f;
+  bp->dma_offset = SB_PCI_DMA;
+ } 
 
  /* With this, plus the rx_header prepended to the data by the
   * hardware, we'll land the ethernet header on a 2-byte boundary.
@@ -1676,13 +1717,12 @@ static int __devinit b44_get_invariants(
  bp->imask = IMASK_DEF;
 
  bp->core_unit = ssb_core_unit(bp);
- bp->dma_offset = SB_PCI_DMA;
 
  /* XXX - really required? 
     bp->flags |= B44_FLAG_BUGGY_TXPTR;
          */
-out:
- return err;
+
+ return 0;
 }
 
 static int __devinit b44_init_one(struct pci_dev *pdev,
@@ -1811,7 +1851,8 @@ static int __devinit b44_init_one(struct
 
  pci_save_state(bp->pdev, bp->pci_cfg_state);
 
- printk(KERN_INFO "%s: Broadcom 4400 10/100BaseT Ethernet ", dev->name);
+ printk(KERN_INFO "%s: Broadcom %s 10/100BaseT Ethernet ", dev->name,
+  (pdev->device == PCI_DEVICE_ID_BCM4713) ? "47xx" : "4400");
  for (i = 0; i < 6; i++)
   printk("%2.2x%c", dev->dev_addr[i],
          i == 5 ? '\n' : ':');
--- linux/drivers/net/b44.h-old4 2004-08-29 17:24:53.000000000 +0200
+++ linux/drivers/net/b44.h 2004-08-29 18:42:56.000000000 +0200
@@ -363,6 +363,7 @@ struct ring_info {
 
 #define B44_MCAST_TABLE_SIZE 32
 #define B44_PHY_ADDR_NO_PHY 30
+#define B44_MDC_RATIO  5000000
 
 /* SW copy of device statistics, kept up to date by periodic timer
  * which probes HW values.  Must have same relative layout as HW


[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH][1/4] b44: Ignore carrier lost errors
  2004-08-29 20:33 ` [PATCH][1/4] b44: Ignore carrier lost errors Florian Schirmer
@ 2004-08-29 20:49   ` Jeff Garzik
  2004-08-29 21:04     ` Florian Schirmer
  2004-09-17 15:54   ` Jeff Garzik
  1 sibling, 1 reply; 18+ messages in thread
From: Jeff Garzik @ 2004-08-29 20:49 UTC (permalink / raw)
  To: Florian Schirmer; +Cc: Pekka Pietikainen, linux-kernel, netdev


Your mailer is mangling the patches.  Can you please resend without this?

The patches need to be apply-able without MIME massaging.

	Jeff



=2D-- linux/drivers/net/b44.c-old1 2004-08-29 16:29:08.000000000 +0200
+++ linux/drivers/net/b44.c 2004-08-29 16:27:00.000000000 +0200
@@ -1347,7 +1347,10 @@ static struct net_device_stats *b44_get_
         hwstat->rx_symbol_errs);
=20
   nstat->tx_aborted_errors =3D hwstat->tx_underruns;
+#if 0
+ /* Carrier lost counter seems to be broken for some devices */
   nstat->tx_carrier_errors =3D hwstat->tx_carrier_lost;
+#endif
=20
   return nstat;
  }

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH][1/4] b44: Ignore carrier lost errors
  2004-08-29 20:49   ` Jeff Garzik
@ 2004-08-29 21:04     ` Florian Schirmer
  2004-08-29 23:45       ` David S. Miller
  2004-09-17 16:02       ` Jeff Garzik
  0 siblings, 2 replies; 18+ messages in thread
From: Florian Schirmer @ 2004-08-29 21:04 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Pekka Pietikainen, linux-kernel, netdev

[-- Attachment #1: Type: text/plain, Size: 297 bytes --]

Hi,
 
> Your mailer is mangling the patches.  Can you please resend without this?
> The patches need to be apply-able without MIME massaging.
 
Sorry for that. KMail seems to mangle the message as soon as you sign it. Please find the non broken versions attached to this mail.

Sorry,
  Florian



[-- Attachment #2: b44-1-broken-carrier-lost.patch --]
[-- Type: text/x-diff, Size: 438 bytes --]

--- linux/drivers/net/b44.c-old1	2004-08-29 16:29:08.000000000 +0200
+++ linux/drivers/net/b44.c	2004-08-29 16:27:00.000000000 +0200
@@ -1347,7 +1347,10 @@ static struct net_device_stats *b44_get_
 				   hwstat->rx_symbol_errs);
 
 	nstat->tx_aborted_errors = hwstat->tx_underruns;
+#if 0
+	/* Carrier lost counter seems to be broken for some devices */
 	nstat->tx_carrier_errors = hwstat->tx_carrier_lost;
+#endif
 
 	return nstat;
 }

[-- Attachment #3: b44-2-remove-dead-ssb-crap.patch --]
[-- Type: text/x-diff, Size: 9015 bytes --]

--- linux/drivers/net/b44.c-old2	2004-08-29 16:27:00.000000000 +0200
+++ linux/drivers/net/b44.c	2004-08-29 16:59:24.000000000 +0200
@@ -130,41 +130,8 @@ static int b44_wait_bit(struct b44 *bp, 
  * interrupts disabled.
  */
 
-#define SBID_SDRAM		0
-#define SBID_PCI_MEM		1
-#define SBID_PCI_CFG		2
-#define SBID_PCI_DMA		3
-#define	SBID_SDRAM_SWAPPED	4
-#define SBID_ENUM		5
-#define SBID_REG_SDRAM		6
-#define SBID_REG_ILINE20	7
-#define SBID_REG_EMAC		8
-#define SBID_REG_CODEC		9
-#define SBID_REG_USB		10
-#define SBID_REG_PCI		11
-#define SBID_REG_MIPS		12
-#define SBID_REG_EXTIF		13
-#define	SBID_EXTIF		14
-#define	SBID_EJTAG		15
-#define	SBID_MAX		16
-
-static u32 ssb_get_addr(struct b44 *bp, u32 id, u32 instance)
-{
-	switch (id) {
-	case SBID_PCI_DMA:
-		return 0x40000000;
-	case SBID_ENUM:
-		return 0x18000000;
-	case SBID_REG_EMAC:
-		return 0x18000000;
-	case SBID_REG_CODEC:
-		return 0x18001000;
-	case SBID_REG_PCI:
-		return 0x18002000;
-	default:
-		return 0;
-	};
-}
+#define SB_PCI_DMA             0x40000000      /* Client Mode PCI memory access space (1 GB) */
+#define BCM4400_PCI_CORE_ADDR  0x18002000      /* Address of PCI core on BCM4400 cards */
 
 static u32 ssb_get_core_rev(struct b44 *bp)
 {
@@ -176,8 +143,7 @@ static u32 ssb_pci_setup(struct b44 *bp,
 	u32 bar_orig, pci_rev, val;
 
 	pci_read_config_dword(bp->pdev, SSB_BAR0_WIN, &bar_orig);
-	pci_write_config_dword(bp->pdev, SSB_BAR0_WIN,
-			       ssb_get_addr(bp, SBID_REG_PCI, 0));
+	pci_write_config_dword(bp->pdev, SSB_BAR0_WIN, BCM4400_PCI_CORE_ADDR);
 	pci_rev = ssb_get_core_rev(bp);
 
 	val = br32(B44_SBINTVEC);
@@ -1676,7 +1642,6 @@ static int __devinit b44_get_invariants(
 	bp->dev->dev_addr[5] = eeprom[82];
 
 	bp->phy_addr = eeprom[90] & 0x1f;
-	bp->mdc_port = (eeprom[90] >> 14) & 0x1;
 
 	/* With this, plus the rx_header prepended to the data by the
 	 * hardware, we'll land the ethernet header on a 2-byte boundary.
@@ -1686,7 +1651,7 @@ static int __devinit b44_get_invariants(
 	bp->imask = IMASK_DEF;
 
 	bp->core_unit = ssb_core_unit(bp);
-	bp->dma_offset = ssb_get_addr(bp, SBID_PCI_DMA, 0);
+	bp->dma_offset = SB_PCI_DMA;
 
 	/* XXX - really required? 
 	   bp->flags |= B44_FLAG_BUGGY_TXPTR;
--- linux/drivers/net/b44.h-old2	2004-08-29 16:25:36.000000000 +0200
+++ linux/drivers/net/b44.h	2004-08-29 17:06:44.000000000 +0200
@@ -223,21 +223,8 @@
 #define B44_RX_SYM	0x05D0UL /* MIB RX Symbol Errors */
 #define B44_RX_PAUSE	0x05D4UL /* MIB RX Pause Packets */
 #define B44_RX_NPAUSE	0x05D8UL /* MIB RX Non-Pause Packets */
-#define B44_SBIPSFLAG	0x0F08UL /* SB Initiator Port OCP Slave Flag */
-#define  SBIPSFLAG_IMASK1	0x0000003f /* Which sbflags --> mips interrupt 1 */
-#define  SBIPSFLAG_ISHIFT1	0
-#define  SBIPSFLAG_IMASK2	0x00003f00 /* Which sbflags --> mips interrupt 2 */
-#define  SBIPSFLAG_ISHIFT2	8
-#define  SBIPSFLAG_IMASK3	0x003f0000 /* Which sbflags --> mips interrupt 3 */
-#define  SBIPSFLAG_ISHIFT3	16
-#define  SBIPSFLAG_IMASK4	0x3f000000 /* Which sbflags --> mips interrupt 4 */
-#define  SBIPSFLAG_ISHIFT4	24
-#define B44_SBTPSFLAG	0x0F18UL /* SB Target Port OCP Slave Flag */
-#define  SBTPS_NUM0_MASK	0x0000003f
-#define  SBTPS_F0EN0		0x00000040
-#define B44_SBADMATCH3	0x0F60UL /* SB Address Match 3 */
-#define B44_SBADMATCH2	0x0F68UL /* SB Address Match 2 */
-#define B44_SBADMATCH1	0x0F70UL /* SB Address Match 1 */
+
+/* Silicon backplane register definitions */
 #define B44_SBIMSTATE	0x0F90UL /* SB Initiator Agent State */
 #define  SBIMSTATE_PC		0x0000000f /* Pipe Count */
 #define  SBIMSTATE_AP_MASK	0x00000030 /* Arbitration Priority */
@@ -269,86 +256,6 @@
 #define  SBTMSHIGH_GCR		0x20000000 /* Gated Clock Request */
 #define  SBTMSHIGH_BISTF	0x40000000 /* BIST Failed */
 #define  SBTMSHIGH_BISTD	0x80000000 /* BIST Done */
-#define B44_SBBWA0	0x0FA0UL /* SB Bandwidth Allocation Table 0 */
-#define  SBBWA0_TAB0_MASK	0x0000ffff /* Lookup Table 0 */
-#define  SBBWA0_TAB0_SHIFT	0
-#define  SBBWA0_TAB1_MASK	0xffff0000 /* Lookup Table 0 */
-#define  SBBWA0_TAB1_SHIFT	16
-#define B44_SBIMCFGLOW	0x0FA8UL /* SB Initiator Configuration Low */
-#define  SBIMCFGLOW_STO_MASK	0x00000003 /* Service Timeout */
-#define  SBIMCFGLOW_RTO_MASK	0x00000030 /* Request Timeout */
-#define  SBIMCFGLOW_RTO_SHIFT	4
-#define  SBIMCFGLOW_CID_MASK	0x00ff0000 /* Connection ID */
-#define  SBIMCFGLOW_CID_SHIFT	16
-#define B44_SBIMCFGHIGH	0x0FACUL /* SB Initiator Configuration High */
-#define  SBIMCFGHIGH_IEM_MASK	0x0000000c /* Inband Error Mode */
-#define  SBIMCFGHIGH_TEM_MASK	0x00000030 /* Timeout Error Mode */
-#define  SBIMCFGHIGH_TEM_SHIFT	4
-#define  SBIMCFGHIGH_BEM_MASK	0x000000c0 /* Bus Error Mode */
-#define  SBIMCFGHIGH_BEM_SHIFT	6
-#define B44_SBADMATCH0	0x0FB0UL /* SB Address Match 0 */
-#define  SBADMATCH0_TYPE_MASK	0x00000003 /* Address Type */
-#define  SBADMATCH0_AD64	0x00000004 /* Reserved */
-#define  SBADMATCH0_AI0_MASK	0x000000f8 /* Type0 Size */
-#define  SBADMATCH0_AI0_SHIFT	3
-#define  SBADMATCH0_AI1_MASK	0x000001f8 /* Type1 Size */
-#define  SBADMATCH0_AI1_SHIFT	3
-#define  SBADMATCH0_AI2_MASK	0x000001f8 /* Type2 Size */
-#define  SBADMATCH0_AI2_SHIFT	3
-#define  SBADMATCH0_ADEN	0x00000400 /* Enable */
-#define  SBADMATCH0_ADNEG	0x00000800 /* Negative Decode */
-#define  SBADMATCH0_BS0_MASK	0xffffff00 /* Type0 Base Address */
-#define  SBADMATCH0_BS0_SHIFT	8
-#define  SBADMATCH0_BS1_MASK	0xfffff000 /* Type1 Base Address */
-#define  SBADMATCH0_BS1_SHIFT	12
-#define  SBADMATCH0_BS2_MASK	0xffff0000 /* Type2 Base Address */
-#define  SBADMATCH0_BS2_SHIFT	16
-#define B44_SBTMCFGLOW	0x0FB8UL /* SB Target Configuration Low */
-#define  SBTMCFGLOW_CD_MASK	0x000000ff /* Clock Divide Mask */
-#define  SBTMCFGLOW_CO_MASK	0x0000f800 /* Clock Offset Mask */
-#define  SBTMCFGLOW_CO_SHIFT	11
-#define  SBTMCFGLOW_IF_MASK	0x00fc0000 /* Interrupt Flags Mask */
-#define  SBTMCFGLOW_IF_SHIFT	18
-#define  SBTMCFGLOW_IM_MASK	0x03000000 /* Interrupt Mode Mask */
-#define  SBTMCFGLOW_IM_SHIFT	24
-#define B44_SBTMCFGHIGH	0x0FBCUL /* SB Target Configuration High */
-#define  SBTMCFGHIGH_BM_MASK	0x00000003 /* Busy Mode */
-#define  SBTMCFGHIGH_RM_MASK	0x0000000C /* Retry Mode */
-#define  SBTMCFGHIGH_RM_SHIFT	2
-#define  SBTMCFGHIGH_SM_MASK	0x00000030 /* Stop Mode */
-#define  SBTMCFGHIGH_SM_SHIFT	4
-#define  SBTMCFGHIGH_EM_MASK	0x00000300 /* Error Mode */
-#define  SBTMCFGHIGH_EM_SHIFT	8
-#define  SBTMCFGHIGH_IM_MASK	0x00000c00 /* Interrupt Mode */
-#define  SBTMCFGHIGH_IM_SHIFT	10
-#define B44_SBBCFG	0x0FC0UL /* SB Broadcast Configuration */
-#define  SBBCFG_LAT_MASK	0x00000003 /* SB Latency */
-#define  SBBCFG_MAX0_MASK	0x000f0000 /* MAX Counter 0 */
-#define  SBBCFG_MAX0_SHIFT	16
-#define  SBBCFG_MAX1_MASK	0x00f00000 /* MAX Counter 1 */
-#define  SBBCFG_MAX1_SHIFT	20
-#define B44_SBBSTATE	0x0FC8UL /* SB Broadcast State */
-#define  SBBSTATE_SRD		0x00000001 /* ST Reg Disable */
-#define  SBBSTATE_HRD		0x00000002 /* Hold Reg Disable */
-#define B44_SBACTCNFG	0x0FD8UL /* SB Activate Configuration */
-#define B44_SBFLAGST	0x0FE8UL /* SB Current SBFLAGS */
-#define B44_SBIDLOW	0x0FF8UL /* SB Identification Low */
-#define  SBIDLOW_CS_MASK	0x00000003 /* Config Space Mask */
-#define  SBIDLOW_AR_MASK	0x00000038 /* Num Address Ranges Supported */
-#define  SBIDLOW_AR_SHIFT	3
-#define  SBIDLOW_SYNCH		0x00000040 /* Sync */
-#define  SBIDLOW_INIT		0x00000080 /* Initiator */
-#define  SBIDLOW_MINLAT_MASK	0x00000f00 /* Minimum Backplane Latency */
-#define  SBIDLOW_MINLAT_SHIFT	8
-#define  SBIDLOW_MAXLAT_MASK	0x0000f000 /* Maximum Backplane Latency */
-#define  SBIDLOW_MAXLAT_SHIFT	12
-#define  SBIDLOW_FIRST		0x00010000 /* This Initiator is First */
-#define  SBIDLOW_CW_MASK	0x000c0000 /* Cycle Counter Width */
-#define  SBIDLOW_CW_SHIFT	18
-#define  SBIDLOW_TP_MASK	0x00f00000 /* Target Ports */
-#define  SBIDLOW_TP_SHIFT	20
-#define  SBIDLOW_IP_MASK	0x0f000000 /* Initiator Ports */
-#define  SBIDLOW_IP_SHIFT	24
 #define B44_SBIDHIGH	0x0FFCUL /* SB Identification High */
 #define  SBIDHIGH_RC_MASK	0x0000000f /* Revision Code */
 #define  SBIDHIGH_CC_MASK	0x0000fff0 /* Core Code */
@@ -356,23 +263,13 @@
 #define  SBIDHIGH_VC_MASK	0xffff0000 /* Vendor Code */
 #define  SBIDHIGH_VC_SHIFT	16
 
-#define  CORE_CODE_ILINE20	0x801
-#define  CORE_CODE_SDRAM	0x803
-#define  CORE_CODE_PCI		0x804
-#define  CORE_CODE_MIPS		0x805
-#define  CORE_CODE_ENET		0x806
-#define  CORE_CODE_CODEC	0x807
-#define  CORE_CODE_USB		0x808
-#define  CORE_CODE_ILINE100	0x80a
-#define  CORE_CODE_EXTIF	0x811
-
 /* SSB PCI config space registers.  */
 #define	SSB_BAR0_WIN		0x80
 #define	SSB_BAR1_WIN		0x84
 #define	SSB_SPROM_CONTROL	0x88
 #define	SSB_BAR1_CONTROL	0x8c
 
-/* SSB core and hsot control registers.  */
+/* SSB core and host control registers.  */
 #define SSB_CONTROL		0x0000UL
 #define SSB_ARBCONTROL		0x0010UL
 #define SSB_ISTAT		0x0020UL
@@ -540,7 +437,6 @@ struct b44 {
 	u32			tx_pending;
 	u32			pci_cfg_state[64 / sizeof(u32)];
 	u8			phy_addr;
-	u8			mdc_port;
 	u8			core_unit;
 
 	struct mii_if_info	mii_if;

[-- Attachment #4: b44-3-phy-less-mode.patch --]
[-- Type: text/x-diff, Size: 2097 bytes --]

--- linux/drivers/net/b44.c-old3	2004-08-29 16:59:24.000000000 +0200
+++ linux/drivers/net/b44.c	2004-08-29 17:24:23.000000000 +0200
@@ -273,6 +273,9 @@ static int b44_readphy(struct b44 *bp, i
 {
 	int err;
 
+	if (bp->phy_addr == B44_PHY_ADDR_NO_PHY)
+		return 0;
+
 	bw32(B44_EMAC_ISTAT, EMAC_INT_MII);
 	bw32(B44_MDIO_DATA, (MDIO_DATA_SB_START |
 			     (MDIO_OP_READ << MDIO_DATA_OP_SHIFT) |
@@ -287,6 +290,9 @@ static int b44_readphy(struct b44 *bp, i
 
 static int b44_writephy(struct b44 *bp, int reg, u32 val)
 {
+	if (bp->phy_addr == B44_PHY_ADDR_NO_PHY)
+		return 0;
+
 	bw32(B44_EMAC_ISTAT, EMAC_INT_MII);
 	bw32(B44_MDIO_DATA, (MDIO_DATA_SB_START |
 			     (MDIO_OP_WRITE << MDIO_DATA_OP_SHIFT) |
@@ -325,6 +331,9 @@ static int b44_phy_reset(struct b44 *bp)
 	u32 val;
 	int err;
 
+	if (bp->phy_addr == B44_PHY_ADDR_NO_PHY)
+		return 0;
+
 	err = b44_writephy(bp, MII_BMCR, BMCR_RESET);
 	if (err)
 		return err;
@@ -395,6 +404,9 @@ static int b44_setup_phy(struct b44 *bp)
 	u32 val;
 	int err;
 
+	if (bp->phy_addr == B44_PHY_ADDR_NO_PHY)
+		return 0;
+
 	if ((err = b44_readphy(bp, B44_MII_ALEDCTRL, &val)) != 0)
 		goto out;
 	if ((err = b44_writephy(bp, B44_MII_ALEDCTRL,
@@ -487,6 +499,19 @@ static void b44_check_phy(struct b44 *bp
 {
 	u32 bmsr, aux;
 
+	if (bp->phy_addr == B44_PHY_ADDR_NO_PHY) {
+		bp->flags |= B44_FLAG_100_BASE_T;
+		bp->flags |= B44_FLAG_FULL_DUPLEX;
+		if (!netif_carrier_ok(bp->dev)) {
+			u32 val = br32(B44_TX_CTRL);
+			val |= TX_CTRL_DUPLEX;
+			bw32(B44_TX_CTRL, val);
+			netif_carrier_on(bp->dev);
+			b44_link_report(bp);
+		}
+		return;
+	}
+
 	if (!b44_readphy(bp, MII_BMSR, &bmsr) &&
 	    !b44_readphy(bp, B44_MII_AUXCTRL, &aux) &&
 	    (bmsr != 0xffff)) {
--- linux/drivers/net/b44.h-old3	2004-08-29 17:06:44.000000000 +0200
+++ linux/drivers/net/b44.h	2004-08-29 17:24:53.000000000 +0200
@@ -362,6 +362,7 @@ struct ring_info {
 };
 
 #define B44_MCAST_TABLE_SIZE	32
+#define B44_PHY_ADDR_NO_PHY	30
 
 /* SW copy of device statistics, kept up to date by periodic timer
  * which probes HW values.  Must have same relative layout as HW

[-- Attachment #5: b44-4-bcm47xx-support.patch --]
[-- Type: text/x-diff, Size: 6556 bytes --]

--- linux/drivers/net/b44.c-old4	2004-08-29 17:24:23.000000000 +0200
+++ linux/drivers/net/b44.c	2004-08-29 18:48:45.000000000 +0200
@@ -1,7 +1,8 @@
-/* b44.c: Broadcom 4400 device driver.
+/* b44.c: Broadcom 4400/47xx device driver.
  *
  * Copyright (C) 2002 David S. Miller (davem@redhat.com)
- * Fixed by Pekka Pietikainen (pp@ee.oulu.fi)
+ * Copyright (C) 2004 Pekka Pietikainen (pp@ee.oulu.fi)
+ * Copyright (C) 2004 Florian Schirmer (jolt@tuxbox.org)
  *
  * Distribute under GPL.
  */
@@ -75,7 +76,7 @@ static char version[] __devinitdata =
 	DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
 
 MODULE_AUTHOR("David S. Miller (davem@redhat.com)");
-MODULE_DESCRIPTION("Broadcom 4400 10/100 PCI ethernet driver");
+MODULE_DESCRIPTION("Broadcom 4400/47xx 10/100 PCI ethernet driver");
 MODULE_LICENSE("GPL");
 MODULE_PARM(b44_debug, "i");
 MODULE_PARM_DESC(b44_debug, "B44 bitmapped debugging message enable value");
@@ -89,6 +90,8 @@ static struct pci_device_id b44_pci_tbl[
 	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
 	{ PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401B1,
 	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
+	{ PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4713,
+	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
 	{ }	/* terminate list with empty entry */
 };
 
@@ -202,29 +205,14 @@ static void ssb_core_reset(struct b44 *b
 	udelay(1);
 }
 
+static int b44_4713_instance;
+
 static int ssb_core_unit(struct b44 *bp)
 {
-#if 0
-	u32 val = br32(B44_SBADMATCH0);
-	u32 base;
-
-	type = val & SBADMATCH0_TYPE_MASK;
-	switch (type) {
-	case 0:
-		base = val & SBADMATCH0_BS0_MASK;
-		break;
-
-	case 1:
-		base = val & SBADMATCH0_BS1_MASK;
-		break;
-
-	case 2:
-	default:
-		base = val & SBADMATCH0_BS2_MASK;
-		break;
-	};
-#endif
-	return 0;
+	if (bp->pdev->device == PCI_DEVICE_ID_BCM4713)
+		return b44_4713_instance++;
+	else
+		return 0;
 }
 
 static int ssb_is_core_up(struct b44 *bp)
@@ -233,6 +221,28 @@ static int ssb_is_core_up(struct b44 *bp
 		== SBTMSLOW_CLOCK);
 }
 
+static void __b44_cam_read(struct b44 *bp, unsigned char *data, int index)
+{
+	u32 val;
+
+	bw32(B44_CAM_CTRL, (CAM_CTRL_READ |
+			    (index << CAM_CTRL_INDEX_SHIFT)));
+
+	b44_wait_bit(bp, B44_CAM_CTRL, CAM_CTRL_BUSY, 100, 1);	
+
+	val = br32(B44_CAM_DATA_LO);
+
+	data[2] = (val >> 24) & 0xFF;
+	data[3] = (val >> 16) & 0xFF;
+	data[4] = (val >> 8) & 0xFF;
+	data[5] = (val >> 0) & 0xFF;
+
+	val = br32(B44_CAM_DATA_HI);
+	
+	data[0] = (val >> 8) & 0xFF;
+	data[1] = (val >> 0) & 0xFF;
+}
+
 static void __b44_cam_write(struct b44 *bp, unsigned char *data, int index)
 {
 	u32 val;
@@ -1110,6 +1120,8 @@ static void b44_clear_stats(struct b44 *
 /* bp->lock is held. */
 static void b44_chip_reset(struct b44 *bp)
 {
+	unsigned int sb_clock;
+
 	if (ssb_is_core_up(bp)) {
 		bw32(B44_RCV_LAZY, 0);
 		bw32(B44_ENET_CTRL, ENET_CTRL_DISABLE);
@@ -1123,9 +1135,10 @@ static void b44_chip_reset(struct b44 *b
 		bw32(B44_DMARX_CTRL, 0);
 		bp->rx_prod = bp->rx_cons = 0;
 	} else {
-		ssb_pci_setup(bp, (bp->core_unit == 0 ?
-				   SBINTVEC_ENET0 :
-				   SBINTVEC_ENET1));
+		if (bp->pdev->device != PCI_DEVICE_ID_BCM4713)
+			ssb_pci_setup(bp, (bp->core_unit == 0 ?
+					   SBINTVEC_ENET0 :
+					   SBINTVEC_ENET1));
 	}
 
 	ssb_core_reset(bp);
@@ -1133,8 +1146,14 @@ static void b44_chip_reset(struct b44 *b
 	b44_clear_stats(bp);
 
 	/* Make PHY accessible. */
+	if (bp->pdev->device == PCI_DEVICE_ID_BCM4713)
+		sb_clock = 100000000; /* 100 MHz */
+	else
+		sb_clock = 62500000; /* 62.5 MHz */
+
 	bw32(B44_MDIO_CTRL, (MDIO_CTRL_PREAMBLE |
-			     (0x0d & MDIO_CTRL_MAXF_MASK)));
+			     (((sb_clock + (B44_MDC_RATIO / 2)) / B44_MDC_RATIO)
+			     & MDIO_CTRL_MAXF_MASK)));
 	br32(B44_MDIO_CTRL);
 
 	if (!(br32(B44_DEVCTRL) & DEVCTRL_IPP)) {
@@ -1654,19 +1673,41 @@ static int __devinit b44_get_invariants(
 {
 	u8 eeprom[128];
 	int err;
+	unsigned long flags;
 
-	err = b44_read_eeprom(bp, &eeprom[0]);
-	if (err)
-		goto out;
-
-	bp->dev->dev_addr[0] = eeprom[79];
-	bp->dev->dev_addr[1] = eeprom[78];
-	bp->dev->dev_addr[2] = eeprom[81];
-	bp->dev->dev_addr[3] = eeprom[80];
-	bp->dev->dev_addr[4] = eeprom[83];
-	bp->dev->dev_addr[5] = eeprom[82];
-
-	bp->phy_addr = eeprom[90] & 0x1f;
+	if (bp->pdev->device == PCI_DEVICE_ID_BCM4713) {
+		/* 
+		 * BCM47xx boards don't have a EEPROM. The MAC is stored in
+		 * a NVRAM area somewhere in the flash memory. As we don't
+		 * know the location and/or the format of the NVRAM area
+		 * here, we simply rely on the bootloader to write the
+		 * MAC into the CAM.
+		 */
+		spin_lock_irqsave(&bp->lock, flags);
+		__b44_cam_read(bp, bp->dev->dev_addr, 0);
+		spin_unlock_irqrestore(&bp->lock, flags);
+
+		/* 
+		 * BCM47xx boards don't have a PHY. Usually there is a switch
+		 * chip with multiple PHYs connected to the PHY port.
+		 */
+		bp->phy_addr = B44_PHY_ADDR_NO_PHY;
+		bp->dma_offset = 0;
+	} else {
+		err = b44_read_eeprom(bp, &eeprom[0]);
+		if (err)
+			return err;
+
+		bp->dev->dev_addr[0] = eeprom[79];
+		bp->dev->dev_addr[1] = eeprom[78];
+		bp->dev->dev_addr[2] = eeprom[81];
+		bp->dev->dev_addr[3] = eeprom[80];
+		bp->dev->dev_addr[4] = eeprom[83];
+		bp->dev->dev_addr[5] = eeprom[82];
+
+		bp->phy_addr = eeprom[90] & 0x1f;
+		bp->dma_offset = SB_PCI_DMA;
+	} 
 
 	/* With this, plus the rx_header prepended to the data by the
 	 * hardware, we'll land the ethernet header on a 2-byte boundary.
@@ -1676,13 +1717,12 @@ static int __devinit b44_get_invariants(
 	bp->imask = IMASK_DEF;
 
 	bp->core_unit = ssb_core_unit(bp);
-	bp->dma_offset = SB_PCI_DMA;
 
 	/* XXX - really required? 
 	   bp->flags |= B44_FLAG_BUGGY_TXPTR;
          */
-out:
-	return err;
+
+	return 0;
 }
 
 static int __devinit b44_init_one(struct pci_dev *pdev,
@@ -1811,7 +1851,8 @@ static int __devinit b44_init_one(struct
 
 	pci_save_state(bp->pdev, bp->pci_cfg_state);
 
-	printk(KERN_INFO "%s: Broadcom 4400 10/100BaseT Ethernet ", dev->name);
+	printk(KERN_INFO "%s: Broadcom %s 10/100BaseT Ethernet ", dev->name,
+		(pdev->device == PCI_DEVICE_ID_BCM4713) ? "47xx" : "4400");
 	for (i = 0; i < 6; i++)
 		printk("%2.2x%c", dev->dev_addr[i],
 		       i == 5 ? '\n' : ':');
--- linux/drivers/net/b44.h-old4	2004-08-29 17:24:53.000000000 +0200
+++ linux/drivers/net/b44.h	2004-08-29 18:42:56.000000000 +0200
@@ -363,6 +363,7 @@ struct ring_info {
 
 #define B44_MCAST_TABLE_SIZE	32
 #define B44_PHY_ADDR_NO_PHY	30
+#define B44_MDC_RATIO		5000000
 
 /* SW copy of device statistics, kept up to date by periodic timer
  * which probes HW values.  Must have same relative layout as HW

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH][1/4] b44: Ignore carrier lost errors
  2004-08-29 21:04     ` Florian Schirmer
@ 2004-08-29 23:45       ` David S. Miller
  2004-08-29 23:49         ` Jeff Garzik
  2004-09-17 16:00         ` Jeff Garzik
  2004-09-17 16:02       ` Jeff Garzik
  1 sibling, 2 replies; 18+ messages in thread
From: David S. Miller @ 2004-08-29 23:45 UTC (permalink / raw)
  To: Florian Schirmer; +Cc: jgarzik, pp, linux-kernel, netdev

On Sun, 29 Aug 2004 23:04:24 +0200
Florian Schirmer <jolt@tuxbox.org> wrote:

> Sorry for that. KMail seems to mangle the message as soon as you sign
> it. Please find the non broken versions attached to this mail.

I think Florian's changes are fine.

BTW, can someone fixup something for me?  Update MODULE_AUTHOR()
please :-)  3/4 of this driver have been rewritten since I last
touched it, heh.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH][1/4] b44: Ignore carrier lost errors
  2004-08-29 23:45       ` David S. Miller
@ 2004-08-29 23:49         ` Jeff Garzik
  2004-08-30  6:10           ` Pekka Pietikainen
  2004-09-17 16:00         ` Jeff Garzik
  1 sibling, 1 reply; 18+ messages in thread
From: Jeff Garzik @ 2004-08-29 23:49 UTC (permalink / raw)
  To: David S. Miller; +Cc: Florian Schirmer, pp, linux-kernel, netdev

On Sun, Aug 29, 2004 at 04:45:28PM -0700, David S. Miller wrote:
> On Sun, 29 Aug 2004 23:04:24 +0200
> Florian Schirmer <jolt@tuxbox.org> wrote:
> 
> > Sorry for that. KMail seems to mangle the message as soon as you sign
> > it. Please find the non broken versions attached to this mail.
> 
> I think Florian's changes are fine.
> 
> BTW, can someone fixup something for me?  Update MODULE_AUTHOR()
> please :-)  3/4 of this driver have been rewritten since I last
> touched it, heh.

hehe.  I'll take care of it tonight when I queue Florian's stuff
to netdev-2.6 (and thus -mm, and thus eventually mainline).

	Jeff

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH][1/4] b44: Ignore carrier lost errors
  2004-08-29 23:49         ` Jeff Garzik
@ 2004-08-30  6:10           ` Pekka Pietikainen
  2004-08-30  7:04             ` Florian Schirmer
  2004-09-17 16:00             ` Jeff Garzik
  0 siblings, 2 replies; 18+ messages in thread
From: Pekka Pietikainen @ 2004-08-30  6:10 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Florian Schirmer, linux-kernel, netdev, David S. Miller

On Sun, Aug 29, 2004 at 07:49:28PM -0400, Jeff Garzik wrote:
> > BTW, can someone fixup something for me?  Update MODULE_AUTHOR()
> > please :-)  3/4 of this driver have been rewritten since I last
> > touched it, heh.
> 
> hehe.  I'll take care of it tonight when I queue Florian's stuff
> to netdev-2.6 (and thus -mm, and thus eventually mainline).
And here's a resend of the bounce buffer patch, which should still
apply on top of Florians (or without) just fine.

Signed-off-by: Pekka Pietikainen <pp@ee.oulu.fi>
--- linux-2.6.8-rc3/drivers/net/b44.h.4g4g	2004-08-08 10:54:03.979353080 +0300
+++ linux-2.6.8-rc3/drivers/net/b44.h	2004-08-08 10:54:17.928232528 +0300
@@ -493,6 +493,7 @@
 
 	struct ring_info	*rx_buffers;
 	struct ring_info	*tx_buffers;
+	unsigned char		*tx_bufs; 
 
 	u32			dma_offset;
 	u32			flags;
@@ -525,7 +526,7 @@
 	struct pci_dev		*pdev;
 	struct net_device	*dev;
 
-	dma_addr_t		rx_ring_dma, tx_ring_dma;
+	dma_addr_t		rx_ring_dma, tx_ring_dma,tx_bufs_dma;
 
 	u32			rx_pending;
 	u32			tx_pending;
--- linux-2.6.8-rc3/drivers/net/b44.c.4g4g	2004-08-08 10:53:58.724151992 +0300
+++ linux-2.6.8-rc3/drivers/net/b44.c	2004-08-08 10:54:17.657273720 +0300
@@ -27,8 +27,8 @@
 
 #define DRV_MODULE_NAME		"b44"
 #define PFX DRV_MODULE_NAME	": "
-#define DRV_MODULE_VERSION	"0.94"
-#define DRV_MODULE_RELDATE	"May 4, 2004"
+#define DRV_MODULE_VERSION	"0.95"
+#define DRV_MODULE_RELDATE	"Aug 3, 2004"
 
 #define B44_DEF_MSG_ENABLE	  \
 	(NETIF_MSG_DRV		| \
@@ -57,6 +57,7 @@
 #define B44_DEF_TX_RING_PENDING		(B44_TX_RING_SIZE - 1)
 #define B44_TX_RING_BYTES	(sizeof(struct dma_desc) * \
 				 B44_TX_RING_SIZE)
+#define B44_DMA_MASK 0x3fffffff
 
 #define TX_RING_GAP(BP)	\
 	(B44_TX_RING_SIZE - (BP)->tx_pending)
@@ -67,6 +68,7 @@
 #define NEXT_TX(N)		(((N) + 1) & (B44_TX_RING_SIZE - 1))
 
 #define RX_PKT_BUF_SZ		(1536 + bp->rx_offset + 64)
+#define TX_PKT_BUF_SZ		(B44_MAX_MTU + ETH_HLEN + 8)
 
 /* minimum number of free TX descriptors required to wake up TX process */
 #define B44_TX_WAKEUP_THRESH		(B44_TX_RING_SIZE / 4)
@@ -631,10 +633,30 @@
 	if (skb == NULL)
 		return -ENOMEM;
 
-	skb->dev = bp->dev;
 	mapping = pci_map_single(bp->pdev, skb->data,
 				 RX_PKT_BUF_SZ,
 				 PCI_DMA_FROMDEVICE);
+
+	/* Hardware bug work-around, the chip is unable to do PCI DMA
+	   to/from anything above 1GB :-( */
+	if(mapping+RX_PKT_BUF_SZ > B44_DMA_MASK) {
+		/* Sigh... */
+		pci_unmap_single(bp->pdev, mapping, RX_PKT_BUF_SZ,PCI_DMA_FROMDEVICE);
+		dev_kfree_skb_any(skb);
+		skb = __dev_alloc_skb(RX_PKT_BUF_SZ,GFP_DMA);
+		if (skb == NULL)
+			return -ENOMEM;
+		mapping = pci_map_single(bp->pdev, skb->data,
+					 RX_PKT_BUF_SZ,
+					 PCI_DMA_FROMDEVICE);
+		if(mapping+RX_PKT_BUF_SZ > B44_DMA_MASK) {
+			pci_unmap_single(bp->pdev, mapping, RX_PKT_BUF_SZ,PCI_DMA_FROMDEVICE);
+			dev_kfree_skb_any(skb);
+			return -ENOMEM;
+		}
+	}
+
+	skb->dev = bp->dev;
 	skb_reserve(skb, bp->rx_offset);
 
 	rh = (struct rx_header *)
@@ -912,6 +934,12 @@
 
 	entry = bp->tx_prod;
 	mapping = pci_map_single(bp->pdev, skb->data, len, PCI_DMA_TODEVICE);
+	if(mapping+len > B44_DMA_MASK) {
+		/* Chip can't handle DMA to/from >1GB, use bounce buffer */
+		pci_unmap_single(bp->pdev, mapping, len,PCI_DMA_TODEVICE);
+		memcpy(bp->tx_bufs+entry*TX_PKT_BUF_SZ,skb->data,skb->len);
+		mapping = pci_map_single(bp->pdev, bp->tx_bufs+entry*TX_PKT_BUF_SZ, len, PCI_DMA_TODEVICE);
+	}
 
 	bp->tx_buffers[entry].skb = skb;
 	pci_unmap_addr_set(&bp->tx_buffers[entry], mapping, mapping);
@@ -1059,6 +1087,11 @@
 				    bp->tx_ring, bp->tx_ring_dma);
 		bp->tx_ring = NULL;
 	}
+	if (bp->tx_bufs) {
+		pci_free_consistent(bp->pdev, B44_TX_RING_SIZE * TX_PKT_BUF_SZ,
+				    bp->tx_bufs, bp->tx_bufs_dma);
+		bp->tx_bufs = NULL;
+	}
 }
 
 /*
@@ -1081,6 +1114,12 @@
 		goto out_err;
 	memset(bp->tx_buffers, 0, size);
 
+	size = B44_TX_RING_SIZE * TX_PKT_BUF_SZ;
+	bp->tx_bufs = pci_alloc_consistent(bp->pdev, size, &bp->tx_bufs_dma);
+	if (!bp->tx_bufs)
+		goto out_err;
+	memset(bp->tx_bufs, 0, size);
+
 	size = DMA_TABLE_BYTES;
 	bp->rx_ring = pci_alloc_consistent(bp->pdev, size, &bp->rx_ring_dma);
 	if (!bp->rx_ring)
@@ -1746,12 +1785,19 @@
 
 	pci_set_master(pdev);
 
-	err = pci_set_dma_mask(pdev, (u64) 0xffffffff);
+	err = pci_set_dma_mask(pdev, (u64) B44_DMA_MASK);
 	if (err) {
 		printk(KERN_ERR PFX "No usable DMA configuration, "
 		       "aborting.\n");
 		goto err_out_free_res;
 	}
+	
+	err = pci_set_consistent_dma_mask(pdev, (u64) B44_DMA_MASK);
+	if (err) {
+	  printk(KERN_ERR PFX "No usable DMA configuration, "
+		 "aborting.\n");
+	  goto err_out_free_res;
+	}
 
 	b44reg_base = pci_resource_start(pdev, 0);
 	b44reg_len = pci_resource_len(pdev, 0);

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH][1/4] b44: Ignore carrier lost errors
  2004-08-30  6:10           ` Pekka Pietikainen
@ 2004-08-30  7:04             ` Florian Schirmer
  2004-09-17 16:00             ` Jeff Garzik
  1 sibling, 0 replies; 18+ messages in thread
From: Florian Schirmer @ 2004-08-30  7:04 UTC (permalink / raw)
  To: Pekka Pietikainen; +Cc: Jeff Garzik, linux-kernel, netdev, David S. Miller

Hi,

while i do agree that this patch is needed and should do what it is 
supposed to do i'm still wondering what the idea behind  
pci_map_single() returning inaccessible DMA addresses is. The pci layer 
knows that the device can only handle addresses up to 1GB. For what 
reasons should it return addresses above that limit? Reading the 
DMA-mappings.txt didn't reveal an answer so maybe someone can shed some 
light onto this topic?

Thanks,
   Florian

Pekka Pietikainen wrote:

>On Sun, Aug 29, 2004 at 07:49:28PM -0400, Jeff Garzik wrote:
>  
>
>>>BTW, can someone fixup something for me?  Update MODULE_AUTHOR()
>>>please :-)  3/4 of this driver have been rewritten since I last
>>>touched it, heh.
>>>      
>>>
>>hehe.  I'll take care of it tonight when I queue Florian's stuff
>>to netdev-2.6 (and thus -mm, and thus eventually mainline).
>>    
>>
>And here's a resend of the bounce buffer patch, which should still
>apply on top of Florians (or without) just fine.
>  
>

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH] Fix for b44 warnings.
  2004-08-29 20:17 [PATCH][0/4] b44: Cleanup and bcm47xx support Florian Schirmer
                   ` (3 preceding siblings ...)
  2004-08-29 20:39 ` [PATCH][4/4] b44: Add bcm47xx support Florian Schirmer
@ 2004-09-13 23:30 ` Stephen Hemminger
  2004-09-13 23:33   ` David S. Miller
  4 siblings, 1 reply; 18+ messages in thread
From: Stephen Hemminger @ 2004-09-13 23:30 UTC (permalink / raw)
  To: Florian Schirmer; +Cc: Pekka Pietikainen, jgarzik, linux-kernel, netdev

B44 driver was using unsigned long as an io memory address.
Recent changes caused this to be a warning.  This patch fixes that
and makes the readl/writel wrapper into inline's instead of macros
with magic variable side effect (yuck).

diff -Nru a/drivers/net/b44.c b/drivers/net/b44.c
--- a/drivers/net/b44.c	2004-09-13 15:33:00 -07:00
+++ b/drivers/net/b44.c	2004-09-13 15:33:00 -07:00
@@ -98,13 +98,24 @@
 static void b44_init_rings(struct b44 *);
 static void b44_init_hw(struct b44 *);
 
+static inline unsigned long br32(const struct b44 *bp, unsigned long reg)
+{
+	return readl(bp->regs + reg);
+}
+
+static inline void bw32(const struct b44 *bp, 
+			unsigned long reg, unsigned long val)
+{
+	writel(val, bp->regs + reg);
+}
+
 static int b44_wait_bit(struct b44 *bp, unsigned long reg,
 			u32 bit, unsigned long timeout, const int clear)
 {
 	unsigned long i;
 
 	for (i = 0; i < timeout; i++) {
-		u32 val = br32(reg);
+		u32 val = br32(bp, reg);
 
 		if (clear && !(val & bit))
 			break;
@@ -168,7 +179,7 @@
 
 static u32 ssb_get_core_rev(struct b44 *bp)
 {
-	return (br32(B44_SBIDHIGH) & SBIDHIGH_RC_MASK);
+	return (br32(bp, B44_SBIDHIGH) & SBIDHIGH_RC_MASK);
 }
 
 static u32 ssb_pci_setup(struct b44 *bp, u32 cores)
@@ -180,13 +191,13 @@
 			       ssb_get_addr(bp, SBID_REG_PCI, 0));
 	pci_rev = ssb_get_core_rev(bp);
 
-	val = br32(B44_SBINTVEC);
+	val = br32(bp, B44_SBINTVEC);
 	val |= cores;
-	bw32(B44_SBINTVEC, val);
+	bw32(bp, B44_SBINTVEC, val);
 
-	val = br32(SSB_PCI_TRANS_2);
+	val = br32(bp, SSB_PCI_TRANS_2);
 	val |= SSB_PCI_PREF | SSB_PCI_BURST;
-	bw32(SSB_PCI_TRANS_2, val);
+	bw32(bp, SSB_PCI_TRANS_2, val);
 
 	pci_write_config_dword(bp->pdev, SSB_BAR0_WIN, bar_orig);
 
@@ -195,18 +206,18 @@
 
 static void ssb_core_disable(struct b44 *bp)
 {
-	if (br32(B44_SBTMSLOW) & SBTMSLOW_RESET)
+	if (br32(bp, B44_SBTMSLOW) & SBTMSLOW_RESET)
 		return;
 
-	bw32(B44_SBTMSLOW, (SBTMSLOW_REJECT | SBTMSLOW_CLOCK));
+	bw32(bp, B44_SBTMSLOW, (SBTMSLOW_REJECT | SBTMSLOW_CLOCK));
 	b44_wait_bit(bp, B44_SBTMSLOW, SBTMSLOW_REJECT, 100000, 0);
 	b44_wait_bit(bp, B44_SBTMSHIGH, SBTMSHIGH_BUSY, 100000, 1);
-	bw32(B44_SBTMSLOW, (SBTMSLOW_FGC | SBTMSLOW_CLOCK |
+	bw32(bp, B44_SBTMSLOW, (SBTMSLOW_FGC | SBTMSLOW_CLOCK |
 			    SBTMSLOW_REJECT | SBTMSLOW_RESET));
-	br32(B44_SBTMSLOW);
+	br32(bp, B44_SBTMSLOW);
 	udelay(1);
-	bw32(B44_SBTMSLOW, (SBTMSLOW_REJECT | SBTMSLOW_RESET));
-	br32(B44_SBTMSLOW);
+	bw32(bp, B44_SBTMSLOW, (SBTMSLOW_REJECT | SBTMSLOW_RESET));
+	br32(bp, B44_SBTMSLOW);
 	udelay(1);
 }
 
@@ -215,31 +226,31 @@
 	u32 val;
 
 	ssb_core_disable(bp);
-	bw32(B44_SBTMSLOW, (SBTMSLOW_RESET | SBTMSLOW_CLOCK | SBTMSLOW_FGC));
-	br32(B44_SBTMSLOW);
+	bw32(bp, B44_SBTMSLOW, (SBTMSLOW_RESET | SBTMSLOW_CLOCK | SBTMSLOW_FGC));
+	br32(bp, B44_SBTMSLOW);
 	udelay(1);
 
 	/* Clear SERR if set, this is a hw bug workaround.  */
-	if (br32(B44_SBTMSHIGH) & SBTMSHIGH_SERR)
-		bw32(B44_SBTMSHIGH, 0);
+	if (br32(bp, B44_SBTMSHIGH) & SBTMSHIGH_SERR)
+		bw32(bp, B44_SBTMSHIGH, 0);
 
-	val = br32(B44_SBIMSTATE);
+	val = br32(bp, B44_SBIMSTATE);
 	if (val & (SBIMSTATE_IBE | SBIMSTATE_TO))
-		bw32(B44_SBIMSTATE, val & ~(SBIMSTATE_IBE | SBIMSTATE_TO));
+		bw32(bp, B44_SBIMSTATE, val & ~(SBIMSTATE_IBE | SBIMSTATE_TO));
 
-	bw32(B44_SBTMSLOW, (SBTMSLOW_CLOCK | SBTMSLOW_FGC));
-	br32(B44_SBTMSLOW);
+	bw32(bp, B44_SBTMSLOW, (SBTMSLOW_CLOCK | SBTMSLOW_FGC));
+	br32(bp, B44_SBTMSLOW);
 	udelay(1);
 
-	bw32(B44_SBTMSLOW, (SBTMSLOW_CLOCK));
-	br32(B44_SBTMSLOW);
+	bw32(bp, B44_SBTMSLOW, (SBTMSLOW_CLOCK));
+	br32(bp, B44_SBTMSLOW);
 	udelay(1);
 }
 
 static int ssb_core_unit(struct b44 *bp)
 {
 #if 0
-	u32 val = br32(B44_SBADMATCH0);
+	u32 val = br32(bp, B44_SBADMATCH0);
 	u32 base;
 
 	type = val & SBADMATCH0_TYPE_MASK;
@@ -263,7 +274,7 @@
 
 static int ssb_is_core_up(struct b44 *bp)
 {
-	return ((br32(B44_SBTMSLOW) & (SBTMSLOW_RESET | SBTMSLOW_REJECT | SBTMSLOW_CLOCK))
+	return ((br32(bp, B44_SBTMSLOW) & (SBTMSLOW_RESET | SBTMSLOW_REJECT | SBTMSLOW_CLOCK))
 		== SBTMSLOW_CLOCK);
 }
 
@@ -275,19 +286,19 @@
 	val |= ((u32) data[3]) << 16;
 	val |= ((u32) data[4]) <<  8;
 	val |= ((u32) data[5]) <<  0;
-	bw32(B44_CAM_DATA_LO, val);
+	bw32(bp, B44_CAM_DATA_LO, val);
 	val = (CAM_DATA_HI_VALID | 
 	       (((u32) data[0]) << 8) |
 	       (((u32) data[1]) << 0));
-	bw32(B44_CAM_DATA_HI, val);
-	bw32(B44_CAM_CTRL, (CAM_CTRL_WRITE |
+	bw32(bp, B44_CAM_DATA_HI, val);
+	bw32(bp, B44_CAM_CTRL, (CAM_CTRL_WRITE |
 			    (index << CAM_CTRL_INDEX_SHIFT)));
 	b44_wait_bit(bp, B44_CAM_CTRL, CAM_CTRL_BUSY, 100, 1);	
 }
 
 static inline void __b44_disable_ints(struct b44 *bp)
 {
-	bw32(B44_IMASK, 0);
+	bw32(bp, B44_IMASK, 0);
 }
 
 static void b44_disable_ints(struct b44 *bp)
@@ -295,34 +306,34 @@
 	__b44_disable_ints(bp);
 
 	/* Flush posted writes. */
-	br32(B44_IMASK);
+	br32(bp, B44_IMASK);
 }
 
 static void b44_enable_ints(struct b44 *bp)
 {
-	bw32(B44_IMASK, bp->imask);
+	bw32(bp, B44_IMASK, bp->imask);
 }
 
 static int b44_readphy(struct b44 *bp, int reg, u32 *val)
 {
 	int err;
 
-	bw32(B44_EMAC_ISTAT, EMAC_INT_MII);
-	bw32(B44_MDIO_DATA, (MDIO_DATA_SB_START |
+	bw32(bp, B44_EMAC_ISTAT, EMAC_INT_MII);
+	bw32(bp, B44_MDIO_DATA, (MDIO_DATA_SB_START |
 			     (MDIO_OP_READ << MDIO_DATA_OP_SHIFT) |
 			     (bp->phy_addr << MDIO_DATA_PMD_SHIFT) |
 			     (reg << MDIO_DATA_RA_SHIFT) |
 			     (MDIO_TA_VALID << MDIO_DATA_TA_SHIFT)));
 	err = b44_wait_bit(bp, B44_EMAC_ISTAT, EMAC_INT_MII, 100, 0);
-	*val = br32(B44_MDIO_DATA) & MDIO_DATA_DATA;
+	*val = br32(bp, B44_MDIO_DATA) & MDIO_DATA_DATA;
 
 	return err;
 }
 
 static int b44_writephy(struct b44 *bp, int reg, u32 val)
 {
-	bw32(B44_EMAC_ISTAT, EMAC_INT_MII);
-	bw32(B44_MDIO_DATA, (MDIO_DATA_SB_START |
+	bw32(bp, B44_EMAC_ISTAT, EMAC_INT_MII);
+	bw32(bp, B44_MDIO_DATA, (MDIO_DATA_SB_START |
 			     (MDIO_OP_WRITE << MDIO_DATA_OP_SHIFT) |
 			     (bp->phy_addr << MDIO_DATA_PMD_SHIFT) |
 			     (reg << MDIO_DATA_RA_SHIFT) |
@@ -382,20 +393,20 @@
 	bp->flags &= ~(B44_FLAG_TX_PAUSE | B44_FLAG_RX_PAUSE);
 	bp->flags |= pause_flags;
 
-	val = br32(B44_RXCONFIG);
+	val = br32(bp, B44_RXCONFIG);
 	if (pause_flags & B44_FLAG_RX_PAUSE)
 		val |= RXCONFIG_FLOW;
 	else
 		val &= ~RXCONFIG_FLOW;
-	bw32(B44_RXCONFIG, val);
+	bw32(bp, B44_RXCONFIG, val);
 
-	val = br32(B44_MAC_FLOW);
+	val = br32(bp, B44_MAC_FLOW);
 	if (pause_flags & B44_FLAG_TX_PAUSE)
 		val |= (MAC_FLOW_PAUSE_ENAB |
 			(0xc0 & MAC_FLOW_RX_HI_WATER));
 	else
 		val &= ~MAC_FLOW_PAUSE_ENAB;
-	bw32(B44_MAC_FLOW, val);
+	bw32(bp, B44_MAC_FLOW, val);
 }
 
 static void b44_set_flow_ctrl(struct b44 *bp, u32 local, u32 remote)
@@ -491,11 +502,11 @@
 
 	val = &bp->hw_stats.tx_good_octets;
 	for (reg = B44_TX_GOOD_O; reg <= B44_TX_PAUSE; reg += 4UL) {
-		*val++ += br32(reg);
+		*val++ += br32(bp, reg);
 	}
 	val = &bp->hw_stats.rx_good_octets;
 	for (reg = B44_RX_GOOD_O; reg <= B44_RX_NPAUSE; reg += 4UL) {
-		*val++ += br32(reg);
+		*val++ += br32(bp, reg);
 	}
 }
 
@@ -535,14 +546,14 @@
 
 		if (!netif_carrier_ok(bp->dev) &&
 		    (bmsr & BMSR_LSTATUS)) {
-			u32 val = br32(B44_TX_CTRL);
+			u32 val = br32(bp, B44_TX_CTRL);
 			u32 local_adv, remote_adv;
 
 			if (bp->flags & B44_FLAG_FULL_DUPLEX)
 				val |= TX_CTRL_DUPLEX;
 			else
 				val &= ~TX_CTRL_DUPLEX;
-			bw32(B44_TX_CTRL, val);
+			bw32(bp, B44_TX_CTRL, val);
 
 			if (!(bp->flags & B44_FLAG_FORCE_LINK) &&
 			    !b44_readphy(bp, MII_ADVERTISE, &local_adv) &&
@@ -587,7 +598,7 @@
 {
 	u32 cur, cons;
 
-	cur  = br32(B44_DMATX_STAT) & DMATX_STAT_CDMASK;
+	cur  = br32(bp, B44_DMATX_STAT) & DMATX_STAT_CDMASK;
 	cur /= sizeof(struct dma_desc);
 
 	/* XXX needs updating when NETIF_F_SG is supported */
@@ -611,7 +622,7 @@
 	    TX_BUFFS_AVAIL(bp) > B44_TX_WAKEUP_THRESH)
 		netif_wake_queue(bp->dev);
 
-	bw32(B44_GPTIMER, 0);
+	bw32(bp, B44_GPTIMER, 0);
 }
 
 /* Works like this.  This chip writes a 'struct rx_header" 30 bytes
@@ -708,7 +719,7 @@
 	u32 cons, prod;
 
 	received = 0;
-	prod  = br32(B44_DMARX_STAT) & DMARX_STAT_CDMASK;
+	prod  = br32(bp, B44_DMARX_STAT) & DMARX_STAT_CDMASK;
 	prod /= sizeof(struct dma_desc);
 	cons = bp->rx_cons;
 
@@ -787,7 +798,7 @@
 	}
 
 	bp->rx_cons = cons;
-	bw32(B44_DMARX_PTR, cons * sizeof(struct dma_desc));
+	bw32(bp, B44_DMARX_PTR, cons * sizeof(struct dma_desc));
 
 	return received;
 }
@@ -851,8 +862,8 @@
 
 	spin_lock_irqsave(&bp->lock, flags);
 
-	istat = br32(B44_ISTAT);
-	imask = br32(B44_IMASK);
+	istat = br32(bp, B44_ISTAT);
+	imask = br32(bp, B44_IMASK);
 
 	/* ??? What the fuck is the purpose of the interrupt mask
 	 * ??? register if we have to mask it out by hand anyways?
@@ -872,8 +883,8 @@
 			       dev->name);
 		}
 
-		bw32(B44_ISTAT, istat);
-		br32(B44_ISTAT);
+		bw32(bp, B44_ISTAT, istat);
+		br32(bp, B44_ISTAT);
 	}
 	spin_unlock_irqrestore(&bp->lock, flags);
 	return IRQ_RETVAL(handled);
@@ -937,11 +948,11 @@
 
 	wmb();
 
-	bw32(B44_DMATX_PTR, entry * sizeof(struct dma_desc));
+	bw32(bp, B44_DMATX_PTR, entry * sizeof(struct dma_desc));
 	if (bp->flags & B44_FLAG_BUGGY_TXPTR)
-		bw32(B44_DMATX_PTR, entry * sizeof(struct dma_desc));
+		bw32(bp, B44_DMATX_PTR, entry * sizeof(struct dma_desc));
 	if (bp->flags & B44_FLAG_REORDER_BUG)
-		br32(B44_DMATX_PTR);
+		br32(bp, B44_DMATX_PTR);
 
 	if (TX_BUFFS_AVAIL(bp) < 1)
 		netif_stop_queue(dev);
@@ -1109,27 +1120,27 @@
 {
 	unsigned long reg;
 
-	bw32(B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ);
+	bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ);
 	for (reg = B44_TX_GOOD_O; reg <= B44_TX_PAUSE; reg += 4UL)
-		br32(reg);
+		br32(bp, reg);
 	for (reg = B44_RX_GOOD_O; reg <= B44_RX_NPAUSE; reg += 4UL)
-		br32(reg);
+		br32(bp, reg);
 }
 
 /* bp->lock is held. */
 static void b44_chip_reset(struct b44 *bp)
 {
 	if (ssb_is_core_up(bp)) {
-		bw32(B44_RCV_LAZY, 0);
-		bw32(B44_ENET_CTRL, ENET_CTRL_DISABLE);
+		bw32(bp, B44_RCV_LAZY, 0);
+		bw32(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE);
 		b44_wait_bit(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE, 100, 1);
-		bw32(B44_DMATX_CTRL, 0);
+		bw32(bp, B44_DMATX_CTRL, 0);
 		bp->tx_prod = bp->tx_cons = 0;
-		if (br32(B44_DMARX_STAT) & DMARX_STAT_EMASK) {
+		if (br32(bp, B44_DMARX_STAT) & DMARX_STAT_EMASK) {
 			b44_wait_bit(bp, B44_DMARX_STAT, DMARX_STAT_SIDLE,
 				     100, 0);
 		}
-		bw32(B44_DMARX_CTRL, 0);
+		bw32(bp, B44_DMARX_CTRL, 0);
 		bp->rx_prod = bp->rx_cons = 0;
 	} else {
 		ssb_pci_setup(bp, (bp->core_unit == 0 ?
@@ -1142,20 +1153,20 @@
 	b44_clear_stats(bp);
 
 	/* Make PHY accessible. */
-	bw32(B44_MDIO_CTRL, (MDIO_CTRL_PREAMBLE |
+	bw32(bp, B44_MDIO_CTRL, (MDIO_CTRL_PREAMBLE |
 			     (0x0d & MDIO_CTRL_MAXF_MASK)));
-	br32(B44_MDIO_CTRL);
+	br32(bp, B44_MDIO_CTRL);
 
-	if (!(br32(B44_DEVCTRL) & DEVCTRL_IPP)) {
-		bw32(B44_ENET_CTRL, ENET_CTRL_EPSEL);
-		br32(B44_ENET_CTRL);
+	if (!(br32(bp, B44_DEVCTRL) & DEVCTRL_IPP)) {
+		bw32(bp, B44_ENET_CTRL, ENET_CTRL_EPSEL);
+		br32(bp, B44_ENET_CTRL);
 		bp->flags &= ~B44_FLAG_INTERNAL_PHY;
 	} else {
-		u32 val = br32(B44_DEVCTRL);
+		u32 val = br32(bp, B44_DEVCTRL);
 
 		if (val & DEVCTRL_EPR) {
-			bw32(B44_DEVCTRL, (val & ~DEVCTRL_EPR));
-			br32(B44_DEVCTRL);
+			bw32(bp, B44_DEVCTRL, (val & ~DEVCTRL_EPR));
+			br32(bp, B44_DEVCTRL);
 			udelay(100);
 		}
 		bp->flags |= B44_FLAG_INTERNAL_PHY;
@@ -1172,13 +1183,13 @@
 /* bp->lock is held. */
 static void __b44_set_mac_addr(struct b44 *bp)
 {
-	bw32(B44_CAM_CTRL, 0);
+	bw32(bp, B44_CAM_CTRL, 0);
 	if (!(bp->dev->flags & IFF_PROMISC)) {
 		u32 val;
 
 		__b44_cam_write(bp, bp->dev->dev_addr, 0);
-		val = br32(B44_CAM_CTRL);
-		bw32(B44_CAM_CTRL, val | CAM_CTRL_ENABLE);
+		val = br32(bp, B44_CAM_CTRL);
+		bw32(bp, B44_CAM_CTRL, val | CAM_CTRL_ENABLE);
 	}
 }
 
@@ -1212,30 +1223,30 @@
 	b44_setup_phy(bp);
 
 	/* Enable CRC32, set proper LED modes and power on PHY */
-	bw32(B44_MAC_CTRL, MAC_CTRL_CRC32_ENAB | MAC_CTRL_PHY_LEDCTRL);
-	bw32(B44_RCV_LAZY, (1 << RCV_LAZY_FC_SHIFT));
+	bw32(bp, B44_MAC_CTRL, MAC_CTRL_CRC32_ENAB | MAC_CTRL_PHY_LEDCTRL);
+	bw32(bp, B44_RCV_LAZY, (1 << RCV_LAZY_FC_SHIFT));
 
 	/* This sets the MAC address too.  */
 	__b44_set_rx_mode(bp->dev);
 
 	/* MTU + eth header + possible VLAN tag + struct rx_header */
-	bw32(B44_RXMAXLEN, bp->dev->mtu + ETH_HLEN + 8 + RX_HEADER_LEN);
-	bw32(B44_TXMAXLEN, bp->dev->mtu + ETH_HLEN + 8 + RX_HEADER_LEN);
+	bw32(bp, B44_RXMAXLEN, bp->dev->mtu + ETH_HLEN + 8 + RX_HEADER_LEN);
+	bw32(bp, B44_TXMAXLEN, bp->dev->mtu + ETH_HLEN + 8 + RX_HEADER_LEN);
 
-	bw32(B44_TX_WMARK, 56); /* XXX magic */
-	bw32(B44_DMATX_CTRL, DMATX_CTRL_ENABLE);
-	bw32(B44_DMATX_ADDR, bp->tx_ring_dma + bp->dma_offset);
-	bw32(B44_DMARX_CTRL, (DMARX_CTRL_ENABLE |
+	bw32(bp, B44_TX_WMARK, 56); /* XXX magic */
+	bw32(bp, B44_DMATX_CTRL, DMATX_CTRL_ENABLE);
+	bw32(bp, B44_DMATX_ADDR, bp->tx_ring_dma + bp->dma_offset);
+	bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE |
 			      (bp->rx_offset << DMARX_CTRL_ROSHIFT)));
-	bw32(B44_DMARX_ADDR, bp->rx_ring_dma + bp->dma_offset);
+	bw32(bp, B44_DMARX_ADDR, bp->rx_ring_dma + bp->dma_offset);
 
-	bw32(B44_DMARX_PTR, bp->rx_pending);
+	bw32(bp, B44_DMARX_PTR, bp->rx_pending);
 	bp->rx_prod = bp->rx_pending;	
 
-	bw32(B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ);
+	bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ);
 
-	val = br32(B44_ENET_CTRL);
-	bw32(B44_ENET_CTRL, (val | ENET_CTRL_ENABLE));
+	val = br32(bp, B44_ENET_CTRL);
+	bw32(bp, B44_ENET_CTRL, (val | ENET_CTRL_ENABLE));
 }
 
 static int b44_open(struct net_device *dev)
@@ -1372,11 +1383,11 @@
 	int i=0;
 	unsigned char zero[6] = {0,0,0,0,0,0};
 
-	val = br32(B44_RXCONFIG);
+	val = br32(bp, B44_RXCONFIG);
 	val &= ~(RXCONFIG_PROMISC | RXCONFIG_ALLMULTI);
 	if (dev->flags & IFF_PROMISC) {
 		val |= RXCONFIG_PROMISC;
-		bw32(B44_RXCONFIG, val);
+		bw32(bp, B44_RXCONFIG, val);
 	} else {
 		__b44_set_mac_addr(bp);
 
@@ -1388,9 +1399,9 @@
 		for(;i<64;i++) {
 			__b44_cam_write(bp, zero, i);			
 		}
-		bw32(B44_RXCONFIG, val);
-        	val = br32(B44_CAM_CTRL);
-	        bw32(B44_CAM_CTRL, val | CAM_CTRL_ENABLE);
+		bw32(bp, B44_RXCONFIG, val);
+        	val = br32(bp, B44_CAM_CTRL);
+	        bw32(bp, B44_CAM_CTRL, val | CAM_CTRL_ENABLE);
 	}
 }
 
@@ -1760,7 +1771,7 @@
 
 	spin_lock_init(&bp->lock);
 
-	bp->regs = (unsigned long) ioremap(b44reg_base, b44reg_len);
+	bp->regs = ioremap(b44reg_base, b44reg_len);
 	if (bp->regs == 0UL) {
 		printk(KERN_ERR PFX "Cannot map device registers, "
 		       "aborting.\n");
diff -Nru a/drivers/net/b44.h b/drivers/net/b44.h
--- a/drivers/net/b44.h	2004-09-13 15:33:00 -07:00
+++ b/drivers/net/b44.h	2004-09-13 15:33:00 -07:00
@@ -395,9 +395,6 @@
 #define SSB_PCI_MASK1		0xfc000000
 #define SSB_PCI_MASK2		0xc0000000
 
-#define br32(REG)	readl(bp->regs + (REG))
-#define bw32(REG,VAL)	writel((VAL), bp->regs + (REG))
-
 /* 4400 PHY registers */
 #define B44_MII_AUXCTRL		24	/* Auxiliary Control */
 #define  MII_AUXCTRL_DUPLEX	0x0001  /* Full Duplex */
@@ -530,7 +527,7 @@
 	struct net_device_stats	stats;
 	struct b44_hw_stats	hw_stats;
 
-	unsigned long		regs;
+	volatile void __iomem   *regs;
 	struct pci_dev		*pdev;
 	struct net_device	*dev;
 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Fix for b44 warnings.
  2004-09-13 23:30 ` [PATCH] Fix for b44 warnings Stephen Hemminger
@ 2004-09-13 23:33   ` David S. Miller
  0 siblings, 0 replies; 18+ messages in thread
From: David S. Miller @ 2004-09-13 23:33 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: jolt, pp, jgarzik, linux-kernel, netdev

On Mon, 13 Sep 2004 16:30:01 -0700
Stephen Hemminger <shemminger@osdl.org> wrote:

> B44 driver was using unsigned long as an io memory address.
> Recent changes caused this to be a warning.  This patch fixes that
> and makes the readl/writel wrapper into inline's instead of macros
> with magic variable side effect (yuck).

Jeff, I'll merge this one.

Thanks Stephen.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH][1/4] b44: Ignore carrier lost errors
  2004-08-29 20:33 ` [PATCH][1/4] b44: Ignore carrier lost errors Florian Schirmer
  2004-08-29 20:49   ` Jeff Garzik
@ 2004-09-17 15:54   ` Jeff Garzik
  1 sibling, 0 replies; 18+ messages in thread
From: Jeff Garzik @ 2004-09-17 15:54 UTC (permalink / raw)
  To: Florian Schirmer; +Cc: Pekka Pietikainen, linux-kernel, netdev

Florian Schirmer wrote:
> Hi,
> 
> some (?) hardware seems to be buggy and is reporting bogus carrier lost 
> values. Both reference implementations from Broadcom indicate that this 
> counter is not reliable and therefore ignore it. We should do the same. 
> "Fixes" the carrier lost problem i've seen.
> 
> Regards,
>   Florian
> 
> Signed-off-by: Florian Schirmer <jolt@tuxbox.org>

patch applied to 2.6.x

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH][2/4] b44: Cleanup SiliconBackplane definitions/functions
  2004-08-29 20:34 ` [PATCH][2/4] b44: Cleanup SiliconBackplane definitions/functions Florian Schirmer
@ 2004-09-17 15:55   ` Jeff Garzik
  0 siblings, 0 replies; 18+ messages in thread
From: Jeff Garzik @ 2004-09-17 15:55 UTC (permalink / raw)
  To: Florian Schirmer; +Cc: Pekka Pietikainen, linux-kernel, netdev

Florian Schirmer wrote:
> Hi,
> 
> there is a good amount of code to support SiliconBackplane functions which are unneeded or simply plain wrong. Lets get rid of it.
> 
> Regards,
>   Florian
> 
> Signed-off-by: Florian Schirmer <jolt@tuxbox.org>


patch applied to 2.6.x.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH][1/4] b44: Ignore carrier lost errors
  2004-08-30  6:10           ` Pekka Pietikainen
  2004-08-30  7:04             ` Florian Schirmer
@ 2004-09-17 16:00             ` Jeff Garzik
  1 sibling, 0 replies; 18+ messages in thread
From: Jeff Garzik @ 2004-09-17 16:00 UTC (permalink / raw)
  To: Pekka Pietikainen; +Cc: Florian Schirmer, linux-kernel, netdev, David S. Miller

Pekka Pietikainen wrote:
> On Sun, Aug 29, 2004 at 07:49:28PM -0400, Jeff Garzik wrote:
> 
>>>BTW, can someone fixup something for me?  Update MODULE_AUTHOR()
>>>please :-)  3/4 of this driver have been rewritten since I last
>>>touched it, heh.
>>
>>hehe.  I'll take care of it tonight when I queue Florian's stuff
>>to netdev-2.6 (and thus -mm, and thus eventually mainline).
> 
> And here's a resend of the bounce buffer patch, which should still
> apply on top of Florians (or without) just fine.
> 
> Signed-off-by: Pekka Pietikainen <pp@ee.oulu.fi>


patch applied to 2.6.x.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH][1/4] b44: Ignore carrier lost errors
  2004-08-29 23:45       ` David S. Miller
  2004-08-29 23:49         ` Jeff Garzik
@ 2004-09-17 16:00         ` Jeff Garzik
  1 sibling, 0 replies; 18+ messages in thread
From: Jeff Garzik @ 2004-09-17 16:00 UTC (permalink / raw)
  To: David S. Miller; +Cc: Florian Schirmer, pp, linux-kernel, netdev

David S. Miller wrote:
> On Sun, 29 Aug 2004 23:04:24 +0200
> Florian Schirmer <jolt@tuxbox.org> wrote:
> 
> 
>>Sorry for that. KMail seems to mangle the message as soon as you sign
>>it. Please find the non broken versions attached to this mail.
> 
> 
> I think Florian's changes are fine.
> 
> BTW, can someone fixup something for me?  Update MODULE_AUTHOR()
> please :-)  3/4 of this driver have been rewritten since I last
> touched it, heh.


done.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH][1/4] b44: Ignore carrier lost errors
  2004-08-29 21:04     ` Florian Schirmer
  2004-08-29 23:45       ` David S. Miller
@ 2004-09-17 16:02       ` Jeff Garzik
  1 sibling, 0 replies; 18+ messages in thread
From: Jeff Garzik @ 2004-09-17 16:02 UTC (permalink / raw)
  To: Florian Schirmer; +Cc: Pekka Pietikainen, linux-kernel, netdev, Andrew Morton

[-- Attachment #1: Type: text/plain, Size: 336 bytes --]


Florian,

I was unable to apply your patch #3 (phy-less-mode) and patch #4 
(bcm47xx support).

Could you please resend these two patches, diff'd against the attached 
b44 driver (my current version in netdev-2.6)?

Please send one patch per email, as per 
http://linux.yyz.us/patch-format.html, even when resending patches.

	Jeff




[-- Attachment #2: b44.tar.bz2 --]
[-- Type: application/x-bzip2, Size: 16289 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2004-09-17 16:02 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-08-29 20:17 [PATCH][0/4] b44: Cleanup and bcm47xx support Florian Schirmer
2004-08-29 20:33 ` [PATCH][1/4] b44: Ignore carrier lost errors Florian Schirmer
2004-08-29 20:49   ` Jeff Garzik
2004-08-29 21:04     ` Florian Schirmer
2004-08-29 23:45       ` David S. Miller
2004-08-29 23:49         ` Jeff Garzik
2004-08-30  6:10           ` Pekka Pietikainen
2004-08-30  7:04             ` Florian Schirmer
2004-09-17 16:00             ` Jeff Garzik
2004-09-17 16:00         ` Jeff Garzik
2004-09-17 16:02       ` Jeff Garzik
2004-09-17 15:54   ` Jeff Garzik
2004-08-29 20:34 ` [PATCH][2/4] b44: Cleanup SiliconBackplane definitions/functions Florian Schirmer
2004-09-17 15:55   ` Jeff Garzik
2004-08-29 20:36 ` [PATCH][3/4] b44: Add support for PHY-less cards Florian Schirmer
2004-08-29 20:39 ` [PATCH][4/4] b44: Add bcm47xx support Florian Schirmer
2004-09-13 23:30 ` [PATCH] Fix for b44 warnings Stephen Hemminger
2004-09-13 23:33   ` David S. Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).