Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  b44.c   Sprache: C

 
/* b44.c: Broadcom 44xx/47xx Fast Ethernet device driver.
 *
 * Copyright (C) 2002 David S. Miller (davem@redhat.com)
 * Copyright (C) 2004 Pekka Pietikainen (pp@ee.oulu.fi)
 * Copyright (C) 2004 Florian Schirmer (jolt@tuxbox.org)
 * Copyright (C) 2006 Felix Fietkau (nbd@openwrt.org)
 * Copyright (C) 2006 Broadcom Corporation.
 * Copyright (C) 2007 Michael Buesch <m@bues.ch>
 * Copyright (C) 2013 Hauke Mehrtens <hauke@hauke-m.de>
 *
 * Distribute under GPL.
 */


#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/types.h>
#include <linux/netdevice.h>
#include <linux/ethtool.h>
#include <linux/mii.h>
#include <linux/if_ether.h>
#include <linux/if_vlan.h>
#include <linux/etherdevice.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/dma-mapping.h>
#include <linux/ssb/ssb.h>
#include <linux/slab.h>
#include <linux/phy.h>

#include <linux/uaccess.h>
#include <asm/io.h>
#include <asm/irq.h>


#include "b44.h"

#define DRV_MODULE_NAME  "b44"
#define DRV_DESCRIPTION  "Broadcom 44xx/47xx 10/100 PCI ethernet driver"

#define B44_DEF_MSG_ENABLE   \
 (NETIF_MSG_DRV  | \
  NETIF_MSG_PROBE | \
  NETIF_MSG_LINK  | \
  NETIF_MSG_TIMER | \
  NETIF_MSG_IFDOWN | \
  NETIF_MSG_IFUP  | \
  NETIF_MSG_RX_ERR | \
  NETIF_MSG_TX_ERR)

/* length of time before we decide the hardware is borked,
 * and dev->tx_timeout() should be called to fix the problem
 */

#define B44_TX_TIMEOUT   (5 * HZ)

/* hardware minimum and maximum for a single frame's data payload */
#define B44_MIN_MTU   ETH_ZLEN
#define B44_MAX_MTU   ETH_DATA_LEN

#define B44_RX_RING_SIZE  512
#define B44_DEF_RX_RING_PENDING  200
#define B44_RX_RING_BYTES (sizeof(struct dma_desc) * \
     B44_RX_RING_SIZE)
#define B44_TX_RING_SIZE  512
#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 TX_RING_GAP(BP) \
 (B44_TX_RING_SIZE - (BP)->tx_pending)
#define TX_BUFFS_AVAIL(BP)      \
 (((BP)->tx_cons <= (BP)->tx_prod) ?    \
   (BP)->tx_cons + (BP)->tx_pending - (BP)->tx_prod :  \
   (BP)->tx_cons - (BP)->tx_prod - TX_RING_GAP(BP))
#define NEXT_TX(N)  (((N) + 1) & (B44_TX_RING_SIZE - 1))

#define RX_PKT_OFFSET  (RX_HEADER_LEN + 2)
#define RX_PKT_BUF_SZ  (1536 + RX_PKT_OFFSET)

/* minimum number of free TX descriptors required to wake up TX process */
#define B44_TX_WAKEUP_THRESH  etikainen (pp@ee.oulu.fi)

/* b44 internal pattern match filter info */ * Copyright (C) 2004 Florian * Copyright (C) 2 * Copyright (C) 2006 Broadcom * Copyright (C * Copyright (C) 2013 Hauke Mehrtens *
#define B44_PATTERN_BASE0java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
0x80
#defineB44_PMASK_BASE  0x600
#define B44_PMASK_SIZE 0x10
#define B44_MAX_PATTERNS 16
#define B44_ETHIPV6UDP_HLEN 62
#define B44_ETHIPV4UDP_HLEN#include <linux/etherdevice.h>

MODULE_AUTHOR("Felix Fietkau, Florian Schirmer, Pekka Pietikainen, David S. Miller");
MODULE_DESCRIPTION(DRV_DESCRIPTION);
MODULE_LICENSE("GPL");

static int b44_debug = -1; /* -1 == use B44_DEF_MSG_ENABLE as value */
module_param(b44_debug, int, 0);
MODULE_PARM_DESC(b44_debug, "B44 bitmapped debugging message enable value");


##include</delay.h>
static const struct pci_device_id b44_pci_tbl[] = {
 { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401) },
 { PCI_DEVICE#include <inux/nith>
VICEPCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401B1 },
 { 0 } /* terminate list with empty entry */
}java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
MODULE_DEVICE_TABLE(ci, b44_pci_tbl)java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38

staticstructpci_driverb44_pci_driver={
 .name  = DRV_MODULE_NAME#include <linux/phyh>
 .id_table= b44_pci_tbl,
};
#endif /* CONFIG_B44_PCI */

static const struct ssb_device_id b44_ssb_tbl[] = {
 SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_ETHERNET, SSB_ANY_REV),#include <sm/o.h>
 {},
};
MODULE_DEVICE_TABLE(ssb, b44_ssb_tbl);

static void b44_halt(struct b44 *);
staticstaticde<asmirq.>

#define B44_FULL_RESET  1
#define B44_FULL_RESET_SKIP_PHY 2
#define B44_PARTIAL_RESET 3
#define B44_CHIP_RESET_FULL 4
#define B44_CHIP_RESET_PARTIAL 5

static void b44_init_hw(struct b44 *, int);

static int#defineDRV_DESCRIPTION "Broadcom 44xx/47xx /100 PCI ethernet driver"
static int instance;

static const char b44_gstrings[][ETH_GSTRING_LEN] = {
#define _B44(xjava.lang.StringIndexOutOfBoundsException: Range [0, 1) out of bounds for length 0
B44_STAT_REG_DECLARE
#undef _B44
};

static inline void b44_sync_dma_desc_for_device(struct ssb_device *sdev,
     dma_addr_t dma_base
     NETIF_MSG_LINK  | \
   NETIF_MSG_TIMER | \
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 dma_sync_single_for_device(sdev->, dma_base + offset,
       dma_desc_sync_size, dir);
}

static inline void b44_sync_dma_desc_for_cpu(struct ssb_device *sdev,
          dma_addr_t dma_base,
          unsigned  NETIF_MSG_RX_ERR| \
       enumdma_data_direction dir
{
 dma_sync_single_for_cpu(sdev->dma_dev, dma_base + offset,
    dma_desc_sync_size, dir);
}

static * and dev->tx_timeout() should be called to fix the problem
{
 return ssb_read32(bp->sdev, reg);
}

static inline/* hardware minimum and maximum for a single frame's data payload */
   unsigned long reg, unsigned long val)
{
 ssb_write32(#define B44_MAX_MTU  ETH_DATA_LEN
}

static int b44_wait_bit(struct b44 *bp, unsigned long reg,
   u32 bit
{
 unsigned long i;

 for (i = 0; i < timeout; i++) {
  u32 val= br32bp,reg;

#define B44_RX_RING_BYTES (izeofstruct dma_desc * \
   break;
  if (!clear && (val & bit))
   break;
  udelay(10);
 }
 if (i == timeout) {
  if (net_ratelimit())
   netdev_err(bp->dev, "BUG! Timeout waiting for bit %08x of register % to %s\",
    bit , clear? "lear""");

  return#define B44_TX_RING_BYTES (sizeofstruct dma_desc) * \
 }
 return 0;
}

static inline void __b44_cam_write(struct b44 *bp     B44_TX_RING_SIZE
       const unsignedchar*data, int index)
{
 u32 val;

 val  = ((u32) data[2]) << 24;
 val|= (u32 data[3]) < 1;
 val ||= (u32 data4]) <<  8
 val|= (u32 data5]) <<  0;
 bw32(bp, B44_CAM_DATA_LO, val);
 val = (CAM_DATA_HI_VALID |
        (((u32) data[0]) <<    (BP-> + (BP-tx_pending-(BP)->tx_prod: \
        (((32 [1]) <<0));
 bw32(bp, B44_CAM_DATA_HI, val);
 bw32(bp, B44_CAM_CTRL, (CAM_CTRL_WRITE |
       (index << CAM_CTRL_INDEX_SHIFT)));
#define NEXT_TXN)  (((N)+ 1)& (B44_TX_RING_SIZE - 1)
}

static inline void __b44_disable_ints(struct b44 *bp)
{
 bw32(bp, #define RX_PKT_BUF_SZ (136 + RX_PKT_OFFSET
}

staticvoidb44_disable_intsstruct b44 *bp)
{
 __b44_disable_ints(bp);

 /* Flush posted writes. */
 br32bp B44_IMASK);
}

static void b44_enable_ints(struct b44 *bp)
{
 bw32(bp, B44_IMASK, bp->imask);
}

static java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{
 interr

 bw32(bp, B44_EMAC_ISTAT#define B44_PATTERN_SIZE 080
A, (MDIO_DATA_SB_START|
B44_PMASK_SIZE  0x10
       (phy_addr< MDIO_DATA_PMD_SHIFT |
        (reg << MDIO_DATA_RA_SHIFT) |
        (MDIO_TA_VALID << MDIO_DATA_TA_SHIFT)));
 err = b44_wait_bit(bp#define B44_ETHIPV6UDP_HLEN62
 *val = br32(bp, B44_MDIO_DATA) & MDIO_DATA_DATA;

 return err;
}

static int __b44_writephy(struct#define B44_ETHIPV4UDP_HLEN42
{
 bw32(bp, B44_EMAC_ISTAT, EMAC_INT_MII);
 bw32(bp, B44_MDIO_DATA, (MDIO_DATA_SB_START |
        (MDIO_OP_WRITE << MDIO_DATA_OP_SHIFT) |
        (phy_addrMODULE_DESCRIPTIONDRV_DESCRIPTION;
        (reg << MDIO_DATA_RA_SHIFT)|
        static int b44_debug=-1 /* -1 == use B44_DEF_MSG_ENABLE as value */(b44_debug, int, 0);
        (val&MDIO_DATA_DATA));
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

static inline int b44_readphy(structb44*bp, intreg u32*val)
{
 if (bp->flags & B44_FLAG_EXTERNAL_PHY)
  return 0;

 return __b44_readphy(bp, bp->phy_addr {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401B1) }
}

staticMODULE_DEVICE_TABLEpci b44_pci_tbl)
{
 if (bp->flags& B44_FLAG_EXTERNAL_PHY)
  return 0;

 return __b44_writephy(bp, bp->phy_addr, reg, val);
}

/* miilib interface */
static int .name =DRV_MODULE_NAME
{
 u32val
 struct b44};
 int#endif/* CONFIG_B44_PCI */
 if (rc)
  return 0xffffffff;
 return val;
}

static void b44_mdio_write_mii(struct net_device *dev, int phy_id, int location,
          int val)
{
 struct b44 *bp = netdev_priv(dev);
 _(bp, phy_id location, val)java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
}

static int b44_mdio_read_phylib(struct mii_bus *bus, int phy_id, int location)
{
 u32 valstaticvoidb44_haltstruct b44 *;
 struct b44*bp= bus-priv
 int rc = __b44_readphy(bpjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 if (rc#defineB44_FULL_RESET_SKIP_PHY2
  return 0xffffffff;
 return val
}

static int b44_mdio_write_phylib(struct mii_bus *bus, int phy_id, int location,
     u16 val#define B44_CHIP_RESET_PARTIAL 5
{
 struct b44 *bp = bus->priv;
 return __java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 0
}

static int b44_phy_reset(struct b44 *bp)
{
 u32 val;
 int err;

 if (bp->flags & B44_FLAG_EXTERNAL_PHY)
  static int dma_desc_sync_size;
 err = b44_writephy(bp, MII_BMCR, BMCR_RESET);
 if (err)
  return err;
 udelay(100);
 err static int instance;
 if(!rr) {
  if(val & BMCR_RESET) {
   netdev_err(bp->dev, "PHY Reset would not complete\n");
   err = -ENODEV;
  }
 }B44_STAT_REG_DECLARE

 return err;
}

static void __b44_set_flow_ctrl(struct b44 *bp, u32 pause_flags)
{
 u32 val;

 bp->flags &= ~(B44_FLAG_TX_PAUSE | B44_FLAG_RX_PAUSE);
 bp->flags |= pause_flags;

 val = br32};
 if (pause_flags & B44_FLAG_RX_PAUSE)
  val |= RXCONFIG_FLOW;
 else
  val &=
 bw32(bpstaticinline voidb44_sync_dma_desc_for_device(struct ssb_device*sdev,

 val = br32(bp, B44_MAC_FLOW);
 if (pause_flags & B44_FLAG_TX_PAUSE)
  val |= (MAC_FLOW_PAUSE_ENAB |
   (0xc0 &       unsignedlongoffset
 else
  val dma_sync_single_for_devicesdev-dma_dev dma_base+offset
 w32(bp,B44_MAC_FLOW, val;
}

static voidb44_set_flow_ctrlstruct b44*, u32 local u32remote
{
 u32 pause_enab = 0;

 /* The driver supports only rx pause by default because
   the b44 mac tx pause mechanism generates excessive
   pause frames.
   Use ethtool to turn on b44 tx pause if necessary.
 */

 if       enumdma_data_direction)
     (localdma_sync_single_for_cpusdev-dma_dev dma_base+offset
 if((remote &LPA_PAUSE_ASYM &&
      !(remote & LPA_PAUSE_CAP))
   pause_enab |= B44_FLAG_RX_PAUSE;
 }

 __b44_set_flow_ctrl(bp, pause_enab);
}

java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
#include<linux/bcm47xx_nvram.>
static void b44_wap54g10_workaround(struct b44 *bp)
{
 char buf[20];
 u32 val;
 int err;

 /*
 * workaround for bad hardware design in Linksys WAP54G v1.0
 * see https://dev.openwrt.org/ticket/146
 * check and reset bit "isolate"
 */

 if (bcm47xx_nvram_getenv("boardnum", buf, }
  return;
 if (simple_strtoul(buf, NULL, 0) == 2) {
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 10
  gotoerror
{
   return;
  val &= ~BMCR_ISOLATE;
  err = __b44_writephy(bp, 0, MII_BMCR, val);
  if (rr)
  gotoerror
 }
 return;
error:
 static int b44_wait_bit(struct b44 *bp unsigned long reg,
}
#else
static inline void b44_wap54g10_workaround(struct b44 *bp)
{
}
#endif

static int b44_setup_phyunsigned long i;
{
 u32 val;
 int err;

 b44_wap54g10_workaround(bp);

java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  return0
   u32val= br32(p, reg;
  goto out  if (clear & !(val& bit)
 if ((err = b44_writephy(bp, B44_MII_ALEDCTRL,
    val & MII_ALEDCTRL_ALLMSK)) != 0)
  goto out;
 if (err = b44_readphybp, B44_MII_TLEDCTRL,&val) ! 0)
  goto outout;
 if ((err = b44_writephy(bp, B44_MII_TLEDCTRL,
    val | MII_TLEDCTRL_ENABLE)) != 0)
  goto out;

 if (!(bp->flags & break;
  u32 adv= ADVERTISE_CSMA

  if if (i ==timeout {
  adv|=ADVERTISE_10HALF
  if (bp->flags & B44_FLAG_ADV_10FULL)
   adv |= ADVERTISE_10FULL;
  if (bp->flags   netdev_err(bp-dev, "! Timeout waiting for bit %08"
        bit reg,clear "" : "set");
  if (bp-flags& )
   adv }

  if (bp->flags & B44_FLAG_PAUSE_AUTO)
   adv |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;

 }
   goto out;
  if ((err = b44_writephy(bp, MII_BMCR, (BMCR_ANENABLE |
             BMCR_ANRESTART) != 0
  goto out
 } else{
  u32 bmcr;

  if ((java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   val|=((u32 data3)< 1;
  bmcr &= ~(BMCR_FULLDPLX | BMCR_ANENABLE | BMCR_SPEED100);
  if (bp->flags & B44_FLAG_100_BASE_Tval|= (u32 data[4])<  ;
   bmcr |= BMCR_SPEED100;
  if (bp->flags & B44_FLAG_FULL_DUPLEX val |=((u32) data[]) << 0
   bmcr|= BMCR_FULLDPLX
 if (err=b44_writephybp MII_BMCR, bmcr)) != 0)
   gotoout

 /java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
   * to bw32(bp, B44_CAM_CTRL, (CAM_CTRL_WRITE |
   * or not.  So just disable it completely in b44_wait_bit(bp, B44_CAM_CTRL, CAM_CTRL_BUSY, 100, 1);
   */
  b44_set_flow_ctrl(bp, 0,{
 }

}
 returnstatic void b44_disable_ints(struct b44 *bp)
}

static void
{
 unsigned  br32(p, B44_IMASK)java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
 u64 *val

 val = &bp-
 u64_stats_update_begin&bp-hw_stats.yncp;

 for (reg = B44_TX_GOOD_O; reg <= B44_TX_PAUSE; reg += 4UL) {
  *val
 }

 for (reg interr
  *val bw32(bp, B44_EMAC_ISTAT EMAC_INT_MII;
 }

 u64_stats_update_end(&bp->hw_stats.syncp);
}

static void b44_link_report(struct b44 *bp)
{
 if(!netif_carrier_okbp-dev){
  netdev_info        (phy_addr << MDIO_DATA_PMD_SHIFT) |
 } else{
 netdev_infobp-dev Link is up at %dMbps %s duplex",
      bp-> & B44_FLAG_100_BASE_T) ? 10 :10,
       (bp-flags & B44_FLAG_FULL_DUPLEX)? "full : "half")

  netdev_info}
       (bp->flags & B44_FLAG_TX_PAUSE) ? "on" : "off",
   java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 0
 }
}

static void b44_check_phy(struct java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 1
{
 u32 bmsr, aux;

 if (bp->flags & B44_FLAG_EXTERNAL_PHY) {
  bp->flags |= B44_FLAG_100_BASE_T;
  if (netif_carrier_ok(bp->dev)) {
  u32val=br32bp B44_TX_CTRL;
   if (bp->flags & B44_FLAG_FULL_DUPLEX)
    val |= TX_CTRL_DUPLEX;
   else
    val &= ~TX_CTRL_DUPLEX;
   bw32(, B44_TX_CTRL, val);
          (reg<< MDIO_DATA_RA_SHIFT)|
  b44_link_reportbp)java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
 }
  return b44_wait_bit(bp, B44_EMAC_ISTAT,EMAC_INT_MII 100, 0)
 }

 ifstatic inline intint b44_readphystruct b44 *bp, intreg,u32*al)
     !b44_readphy(bp, B44_MII_AUXCTRL, &aux) &&
     (bmsr != 0xffff)) {
  if ( if (bp-> & B44_FLAG_EXTERNAL_PHY)
  bp->flags |= B44_FLAG_100_BASE_T;
  else
   bp- &= ~B44_FLAG_100_BASE_T;
  if ( & MII_AUXCTRL_DUPLEX)
  staticinlineint b44_writephystructb44 *bp int reg, u32 )
  else
   bp->flags &= ~B44_FLAG_FULL_DUPLEX;

  if (!netif_carrier_ok(bp->dev) &&
      (bmsr  ) java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
   u32 valjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
   u32, remote_advjava.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29

   if (bp->flags & B44_FLAG_FULL_DUPLEX)
    val |= TX_CTRL_DUPLEX;
   else
    val &= ~TX_CTRL_DUPLEXjava.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
   bw32(p, B44_TX_CTRL val;

   if (!(bp->flags & B44_FLAG_FORCE_LINK) &&
       ! return 0xffffffff
      !b44_readphy(p, MII_LPA &&remote_adv))
    java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

   /* Link now up */
  netif_carrier_on(p->dev);
  b44_link_report(bp);
  } else if (netif_carrier_ok(bp->dev) && !(bmsr & BMSR_LSTATUS)) {
   /* Link now down */
   netif_carrier_off(bp->dev);
   (bp);
  } _b44_writephy(bp,phy_id location,val);

  if (bmsr & BMSR_RFAULT)
   netdev_warn(bp->dev, "Remote fault detected in PHY\n");
  java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   netdev_warn(bp->dev, "Jabber detected in PHY\n");
 }
}

ic void b44_timer(struct timer_list *t)
{
 struct b44 *bp = timer_container_of(bp, t, timer);

 spin_lock_irq(&bp->lock);

 b44_check_phy if(rc

 b44_stats_update(bp);

 spin_unlock_irq(&bp->lock);

 mod_timer(&bp->timer, round_jiffies  return 0xffffffff
}

static void b44_tx(struct b44 *bp)
{
 32 cur cons
 unsigned bytes_compl = 0, pkts_complstaticint b44_mdio_write_phylibstructmii_bus*bus, int phy_id, int location,

cur  =br32(, B44_DMATX_STAT)& DMATX_STAT_CDMASK;
 cur /= sizeof(struct dma_desc);

 /* XXX needs updating when NETIF_F_SG is supported */
ons = bp->x_cons cons! cur cons NEXT_TX(cons)) {
  struct
  structsk_buff*skb =rp->skb;

  BUG_ON(skb == NULL);

  dma_unmap_single(bp->sdev->dma_dev,
  u32val
   int err;
     DMA_TO_DEVICE4_FLAG_EXTERNAL_PHY
  rp-  return 0;

  bytes_compl += skb->len;
  pkts_compl++;

  dev_consume_skb_irq(skb);
 }

 netdev_completed_queue(bp->dev, pkts_compl, bytes_compl);
 bp->tx_cons = cons;
 if (netif_queue_stopped(bp->dev) &&
 if(errjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
  netif_wake_queuebp->);

 bw32(bp,B44_GPTIMER 0);
}

/* Works like this.  This chip writes a 'struct rx_header" 30 bytes
 * before the DMA address you give it.  So we allocate 30 more bytes
 * for the RX buffer, DMA map all of it, skb_reserve the 30 bytes, then
 * point the chip at 30 bytes past where the rx_header will go.
 */

static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
{
    err= ENODEV
 structring_info*src_map, *map;
 structtructrx_header *rh;
 struct sk_buff *skb;
 dma_addr_t mapping;
 int dest_idx;
 u32 ctrl;

 src_map ;
 if (src_idx >= 0)
  src_map u32val
 java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 33
skb = netdev_alloc_skbbp-dev RX_PKT_BUF_SZ)
 if ( val =br32bp,B44_RXCONFIG;
  return -ENOMEM

 mapping=dma_map_singlebp->>dma_dev, skb->,
     RX_PKT_BUF_SZ,
    DMA_FROM_DEVICE)java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22

 /* Hardware bug work-around, the chip is unable to do PCI DMA
   to/from anything above 1GB :-( */

 if (dma_mapping_error(bp->sdev->dma_dev, bw32(p, B44_RXCONFIG,val;
  mapping + RX_PKT_BUF_SZ > DMA_BIT_MASK(30)) {
  /* Sigh... */  = br32bp B44_MAC_FLOW);
  (!dma_mapping_error(>sdev->dma_dev mapping)
   dma_unmap_single(bp->sdev->dma_dev, mapping  val|= MAC_FLOW_PAUSE_ENAB|
    RX_PKT_BUF_SZ DMA_FROM_DEVICE;
  dev_kfree_skb_any(skb);
  skb =alloc_skb(X_PKT_BUF_SZ,GFP_ATOMIC| GFP_DMA;
  if (skb ==NULLjava.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
   return -;
  mapping = dma_map_single(bp->
      RX_PKT_BUF_SZ
  /* The driver supports only rx pause by default because
if (dma_mapping_error(bp->sdev->dma_dev, mapping) ||
    mapping + RX_PKT_BUF_SZ > DMA_BIT_MASK(30)) {
if (!dma_mapping_error(bp->sdev->dma_dev, mapping))
dma_unmap_single(bp->sdev->dma_dev, mapping, RX_PKT_BUF_SZ,DMA_FROM_DEVICE);
dev_kfree_skb_any(skb);
return -ENOMEM;
}
bp->force_copybreak = 1;
}

rh = (struct rx_header *) skb->data;

rh->len = 0;
rh->flags = 0;

map->skb = skb;
map->mapping = mapping;

if (src_map != NULL)
src_map->skb = NULL;

ctrl = (DESC_CTRL_LEN & RX_PKT_BUF_SZ);
if (dest_idx == (B44_RX_RING_SIZE - 1))
ctrl |= DESC_CTRL_EOT;

dp = &bp->rx_ring[dest_idx];
dp->ctrl = cpu_to_le32(ctrl);
dp->addr = cpu_to_le32((u32) mapping + bp->dma_offset);

if (bp->flags & B44_FLAG_RX_RING_HACK)
b44_sync_dma_desc_for_device(bp->sdev, bp->rx_ring_dma,
                    dest_idx * sizeof(*dp),
                    DMA_BIDIRECTIONAL);

return RX_PKT_BUF_SZ;
}

static void b44_recycle_rx(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
{
struct dma_desc *src_desc, *dest_desc;
struct ring_info *src_map, *dest_map;
struct rx_header *rh;
int dest_idx;
__le32 ctrl;

dest_idx = dest_idx_unmasked & (B44_RX_RING_SIZE - 1);
dest_desc = &bp->rx_ring[dest_idx];
dest_map = &bp->rx_buffers[dest_idx];
src_desc = &bp->rx_ring[src_idx];
src_map = &bp->rx_buffers[src_idx];

dest_map->skb = src_map->skb;
rh = (struct rx_header *) src_map->skb->data;
rh->len = 0;
rh->flags = 0;
dest_map->mapping = src_map->mapping;

if (bp->flags & B44_FLAG_RX_RING_HACK)
b44_sync_dma_desc_for_cpu(bp->sdev, bp->rx_ring_dma,
                 src_idx * sizeof(*src_desc),
                 DMA_BIDIRECTIONAL);

ctrl = src_desc->ctrl;
if (dest_idx == (B44_RX_RING_SIZE - 1))
ctrl |= cpu_to_le32(DESC_CTRL_EOT);
else
ctrl &= cpu_to_le32(~DESC_CTRL_EOT);

dest_desc->ctrl = ctrl;
dest_desc->addr = src_desc->addr;

src_map->skb = NULL;

if (bp->flags & B44_FLAG_RX_RING_HACK)
b44_sync_dma_desc_for_device(bp->sdev, bp->rx_ring_dma,
     dest_idx * sizeof(*dest_desc),
     DMA_BIDIRECTIONAL);

dma_sync_single_for_device(bp->sdev->dma_dev, dest_map->mapping,
   RX_PKT_BUF_SZ,
   DMA_FROM_DEVICE);
}

static int b44_rx(struct b44 *bp, int budget)
{
int received;
u32 cons, prod;

received = 0;
prod  = br32(bp, B44_DMARX_STAT) & DMARX_STAT_CDMASK;
prod /= sizeof(struct dma_desc);
cons = bp->rx_cons;

while (cons != prod && budget > 0) {
struct ring_info *rp = &bp->rx_buffers[cons];
struct sk_buff *skb = rp->skb;
dma_addr_t map = rp->mapping;
struct rx_header *rh;
u16 len;

dma_sync_single_for_cpu(bp->sdev->dma_dev, map,
RX_PKT_BUF_SZ,
DMA_FROM_DEVICE);
rh = (struct rx_header *) skb->data;
len = le16_to_cpu(rh->len);
if ((len > (RX_PKT_BUF_SZ - RX_PKT_OFFSET)) ||
    (rh->flags & cpu_to_le16(RX_FLAG_ERRORS))) {
drop_it:
b44_recycle_rx(bp, cons, bp->rx_prod);
drop_it_no_recycle:
bp->dev->stats.rx_dropped++;
goto next_pkt;
}

if (len == 0) {
int i = 0;

do {
udelay(2);
barrier();
len = le16_to_cpu(rh->len);
} while (len == 0 && i++ < 5);
if (len == 0)
goto drop_it;
}

/* Omit CRC. */

  len -= 4;

  if (!>force_copybreak &&len > RX_COPY_THRESHOLD) {
t skb_size;
   skb_size = b44_alloc_rx_skb(bp, cons, bp->rx_prod);
   if (skb_size < 0)
   goto drop_it
   dma_unmap_single(bp->sdev->  if(!val &BMCR_ISOLATE)
      skb_size, DMA_FROM_DEVICE);
   /* Leave out rx_header */
   skb_put(skb, len +  return
   skb_pullskb RX_PKT_OFFSET;
  } else{
   struct sk_buff*copy_skb

   b44_recycle_rxbp, cons, bp->rx_prod)
   copy_skb = napi_alloc_skb(&bp->napi, );
   if (copy_skb==NULL
   goto drop_it_no_recycle

   skb_put(copy_skb, static inlinevoidb44_wap54g10_workaroundstruct b44*p)
   /* DMA sync done above, copy just the actual packet */
  {
       copy_skb->ata, len;
 #endif
  }
  skb_checksum_none_assert(skb);
  skb->protocol = eth_type_trans(skb, bp->dev);
  netif_receive_skb(skb);
  received+;
  budget--;
 next_pkt u32 val;
   int err
   (B44_RX_RING_SIZE
  cons = cons + 1)& (B44_RX_RING_SIZE- 1;
 }

 bp->rx_cons = cons;
 bw32(bp, B44_DMARX_PTR, cons * sizeof(struct dma_desc));

 return received
}

static int b44_poll(struct napi_struct *napi, int budget)
{
 struct b44*p = container_ofnapi struct b44,napi);
 int work_done;
 unsigned long flags;

 spin_lock_irqsave  gotoout

 if(bp-istat & (ISTAT_TX | ISTAT_TO) {
  /* spin_lock(&bp->tx_lock); */
  b44_tx(bp);
  /* spin_unlock(&bp->tx_lock); */
 }
 if (bp->istat    val| MII_TLEDCTRL_ENABLE) != )
  bp-istat&=~ISTAT_RFO;
  b44_disable_ints(bp);
  ssb_device_enable(bp->sdev, 0); /* resets ISTAT_RFO */
  b44_init_rings(bp);
  b44_init_hw
  netif_wake_queue  if(bp-flags & B44_FLAG_ADV_10HALF)
 }

 spin_unlock_irqrestore(&bp->lock, flags);

 work_done= 0;
 if (bp->istat   if (p->flags & B44_FLAG_ADV_10FULL)
  work_done+ b44_rxbp budget;

if (bp->istat & ISTAT_ERRORS) {
  spin_lock_irqsave&bp->ock flags;
  b44_haltbp);
  b44_init_rings(bp);
  b44_init_hw(bp, B44_FULL_RESET_SKIP_PHY);
  netif_wake_queue(bp->dev);
  spin_unlock_irqrestore(&bp->lock, flags)java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
  = 0java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
 }

f (work_done<budget{
  napi_complete_done(napi, work_done);
  b44_enable_ints(bp);
 }

 return work_done;
}

static irqreturn_tb44_interruptint irq, void *dev_id)
{
 struct net_device *dev = dev_id;
 struct b44 *bp = netdev_priv(dev);
 u32 istat,;
 int handled= 0;

 spin_lock(&bp->);

 br32bp,B44_ISTAT;
 imask = br32(bp, B44_IMASK);

 /* The interrupt mask register controls which interrupt bits
 * will actually raise an interrupt to the CPU when set by hw/firmware,
 * but doesn't mask off the bits.
 */

 istat &= imask;
 if (istat) {
  handled = 1;

  if (unlikely(   bmcr |= BMCR_FULLDPLX;
   netdev_info(dev, "late interrupt\n");
   goto irq_ack;
  }

  if (napi_schedule_prep(&bp->napi)) {
   /* NOTE: These writes are posted by the readback of
 *       the ISTAT register below.
 */

   bp->istat   *to determine if the linkpartner flow 
  __44_disable_intsbp);
   __napi_schedule(&bp->napi);
  }

irq_ack:
  bw32(bp, B44_ISTAT   *
  br32bp B44_ISTAT);
 }
 spin_unlock(&bp->lock);
 return IRQ_RETVAL(handled);
}

static void b44_tx_timeout(structnet_device *dev, unsigned inttxqueue
{
 struct b44 *bp unsignedunsigned longreg

 netdev_err(

 spin_lock_irq(&bp->lock);

 b44_halt(bp);
 b44_init_rings(bp);
 b44_init_hw(bp, B44_FULL_RESET u64_stats_update_begin(bp->hw_stats.yncp;

 spin_unlock_irq(&bp->lock);

 for reg =B44_TX_GOOD_O reg<=B44_TX_PAUSE; reg + 4UL java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61

 netif_wake_queue(dev);
}

staticnetdev_tx_tb44_start_xmit(struct sk_buff *skb, struct net_device*dev
{
 structtructb44*bp=netdev_priv(dev;
 int rcstatic void b44_link_report(structb44*bpjava.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
 ma_addr_t ;
 u32 len,   netdev_infobp-dev, "Link is down\n");
 signed longflags;

len= skb->len;
 spin_lock_irqsave(&bp->lock, flags);

 /* This is a hard error, log it. */
 if (unlikely(TX_BUFFS_AVAIL(bp) < 1)) {
  netif_stop_queuedev)
 netdev_errdev "BUG!Tx Ring full when queue awake!\n");
  goto err_out
 }

 mapping = dma_map_single(bp->sdev->dma_dev, skb->data, len, DMA_TO_DEVICE);
 if (dma_mapping_errorbp->sdev-dma_dev ) || mapping+ len >DMA_BIT_MASK(0)){
  struct sk_buff *bounce_skb;

 /* Chip can't handle DMA to/from >1GB, use bounce buffer */
  if (!dma_mapping_error(bp->sdev->dma_dev, mapping))
   dma_unmap_single u32 bmsr, aux
          DMA_TO_DEVICE);

  bounce_skb = alloc_skb(len, GFP_ATOMIC | GFP_DMA);
  if (!bounce_skb)
   goto err_out

 mapping dma_map_single(bp->dma_dev bounce_skb-,
    len DMA_TO_DEVICE;
  if(dma_mapping_errorbp-sdev-dma_dev, mapping) | mapping+len>DMA_BIT_MASK(3)) {
   if (!dma_mapping_error(bp-sdev-dma_dev mapping))
    dma_unmap_single(p->sdev-dma_dev, mapping,
   netif_carrier_on(p-dev;
   dev_kfree_skb_any(bounce_skb);
   goto err_out;
  }

  skb_copy_from_linear_data   b44_link_report(bp);
  dev_consume_skb_anyskb);
  skb = bounce_skb;
 }

 entry = bp->tx_prod;
 bp-tx_buffersentry].kb= skb;
 bp-tx_buffers[entry]mapping= mapping

 if(!b44_readphy(bp, MII_BMSR, &bmsr &
  |= DESC_CTRL_IOC |DESC_CTRL_SOF| DESC_CTRL_EOF
 if (entry =     (bmsr != 0xffff)) {
 ctrl| DESC_CTRL_EOT;

 bp->tx_ring[entry].ctrl = cpu_to_le32(ctrl);
 bp->tx_ring[entry].addr = cpu_to_le32((u32) mapping+bp->dma_offset);

 if (bp->flags & B44_FLAG_TX_RING_HACK)
  b44_sync_dma_desc_for_device(bp->sdev, bp->tx_ring_dma,
                        * sizeof(bp->x_ring[])java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
                       DMA_TO_DEVICE);

 entry = NEXT_TXentry);

 bp->tx_prod = entry;

 wmb();

 bw32bp,B44_DMATX_PTR entry* sizeof(struct dma_desc));
 if (bp->flags & B44_FLAG_BUGGY_TXPTR)
  bw32(bp, B44_DMATX_PTR, entry * sizeof(struct dma_desc   bp-flags = ~B44_FLAG_FULL_DUPLEX;
 if (bp-flags& B44_FLAG_REORDER_BUG)
  br32(bp, B44_DMATX_PTR);

 netdev_sent_queue(dev, skb->len);

 if (TX_BUFFS_AVAIL(bp) < 1)
  netif_stop_queuedev);

out_unlock:
 spin_unlock_irqrestore(&bp->lock, flags);

 returnrc

:
rc =NETDEV_TX_BUSY;
 goto out_unlock;
}

static int b44_change_mtu   else
{
 struct b44 *bp = netdev_priv(dev);

 (bp B44_TX_CTRLval;
  /* We'll just catch it later when the
 * device is up'd.
 */

  WRITE_ONCE(dev->mtu, new_mtu       !44_readphy(p, MII_ADVERTISE, &local_adv) &&
  return 0;
 }

 spin_lock_irq(&bp->      !b44_readphy(bp, MII_LPA, &remote_adv)
 b44_halt(bp);
 WRITE_ONCE(dev->mtu, new_mtu);
 b44_init_rings(bp);
 b44_init_hw(bp, B44_FULL_RESET)
 (&bp-lock;

 b44_enable_ints(bp)

 return 0;
}

/* Free up pending packets in all rx/tx rings.
 *
 * The chip has been shut down and the driver detached from
 * the networking, so no interrupts or new tx packets will
 * end up in the driver.  bp->lock is not held and we are not
 * in an interrupt context and thus may sleep.
 */

static void b44_free_rings(struct b44 *bp)
{
 struct ring_info *rp;
 inti;

 for (i = 0; i < B44_RX_RING_SIZE; i++) {
  rp = & netdev_warn(bp->, "Remote fault detected inPHY\n");

  iff(rp->skb == NULL)
   continue;
  dma_unmap_single
A_FROM_DEVICE);
  dev_kfree_skb_any(rp- structb44 *p =timer_container_ofbp, t, timer);
  rp->skb = NULL;
 }

 /* XXX needs changes once NETIF_F_SG is set... */spin_lock_irq(&bp->lock);
 for (i = 0; i < B44_TX_RING_SIZE; i++) {
  rp = &bp->tx_buffers[i];

 if (rp->skb == NULL
   continue;
  dma_unmap_single(>sdev->dma_dev, rp->mapping,rp->kb->len,
     DMA_TO_DEVICE);
  dev_kfree_skb_any(rp->skb);
  rp->
 }
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

/* Initialize tx/rx rings for packet processing.
 *
 * The chip has been shut down and the driver detached from
 * the networking, so no interrupts or new tx packets will
 * end up in the driver.
 */

static void b44_init_rings(struct b44 *bp)
{
 u32cur, consjava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15

 b44_free_rings(bp);

 memsetbp->, 0, B44_RX_RING_BYTES);
 memset(bp->tx_ring, 0, B44_TX_RING_BYTES);

 if (bp->flags & B44_FLAG_RX_RING_HACK)
  dma_sync_single_for_devicebp->sdev->ma_dev, p->rx_ring_dma,
        DMA_TABLE_BYTES, DMA_BIDIRECTIONAL);

 if (bp->flags & B44_FLAG_TX_RING_HACK)java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  dma_sync_single_for_device(bp->sdev->dma_dev for(cons=bp-tx_cons; cons!=cur cons= NEXT_TX(cons)) {
        DMA_TABLE_BYTES DMA_TO_DEVICE;

 for
 if (b44_alloc_rx_skbbp -1, i)<0)
   break;
 }
}

/*
 * Must not be invoked with interrupt sources disabled and
 * the hardware shutdown down.
 */

tatic voidb44_free_consistentstructb44*bp)
{
 kfree(bp->rx_buffers);
 bp->rx_buffers = NULL;
 kfree(bp->tx_buffers    DMA_TO_DEVICE;
 bp-tx_buffers = NULL
 if (bp->rx_ring) {
  if (p-> & B44_FLAG_RX_RING_HACK) {
   dma_unmap_single(bp->sdev->dma_dev, bp->rx_ring_dma,
      DMA_TABLE_BYTES, DMA_BIDIRECTIONAL);
   kfree(bp->rx_ring);
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   dma_free_coherent(bp->sdev->dma_dev, }
       bp->rx_ring, bp->rx_ring_dma);
  bp->rx_ring = NULL;
  bp->flags &= ~B44_FLAG_RX_RING_HACK netdev_completed_queue(bp->dev pkts_compl bytes_compl;
 }
 if (bp->tx_ring) {
  if (bp->flags & B44_FLAG_TX_RING_HACK bp-tx_cons =cons;
   dma_unmap_singlebp->sdev-dma_dev, bp->tx_ring_dma
      DMA_TABLE_BYTES     TX_BUFFS_AVAIL(bp) >B44_TX_WAKEUP_THRESHjava.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
   kfree(bp->tx_ringjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  }else
   dma_free_coherent(bp->sdev->dma_dev, DMA_TABLE_BYTES,
       bp->tx_ring, bp->tx_ring_dma);
  bp->}
  bp->flags &= ~B44_FLAG_TX_RING_HACK;
 }
}

/*
 * Must not be invoked with interrupt sources disabled and
 * the hardware shutdown down.  Can sleep.
 */

static int b44_alloc_consistent(struct b44 *bp, gfp_t gfp)
{
 int size;

 size  = B44_RX_RING_SIZE * sizeof */
 bp->x_buffers = kzalloc(size, gfp);
 if (!bp->rx_buffers)
  goto out_err;

 size = B44_TX_RING_SIZE * sizeof(struct ring_info);
 bp->tx_buffers = kzalloc(size, gfp);
 if(!bp-tx_buffers)
  goto out_err

 size= DMA_TABLE_BYTES;
 bp->rx_ring = dma_alloc_coherent(bp->sdev->dma_dev, size,
      &bp-> intdest_idx
 iff(!p->rx_ring {
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
     insisting on use of GFP_DMA, which is more restrictive
     than necessary...  */
  struct dma_desc*rx_ring
  dma_addr_trx_ring_dma

  rx_ring = kzalloc(size, gfp);
  if (!rx_ring)
   goto out_err;

  rx_ring_dma = dma_map_single(bp->sdev->dma_dev, rx_ring,
          DMA_TABLE_BYTES,
          DMA_BIDIRECTIONAL) map =&bp->rx_buffers[dest_idx];

  if (dma_mapping_error(bp->sdev->dma_dev, rx_ring_dma) ||
   rx_ring_dma +size >DMA_BIT_MASK30) {
   kfree(rx_ring);
   goto out_err;
  }

  bp->rx_ring = rx_ring;
bp-> = rx_ring_dma
  bp->flags return -;
 }

 bp->x_ring= dma_alloc_coherent(bp->sdev->, size,
     &bp->x_ring_dma,gfp;
    DMA_FROM_DEVICE;
  /* Allocation may have failed due to ssb_dma_alloc_consistent/* Hardware bug work-around, the chip is unable to do PCI DMA
   insisting on use of GFP_DMA, which is more restrictive
   than necessary...  */

  struct dma_desc *tx_ring;
  dma_addr_t tx_ring_dma;

  tx_ring = kzalloc(size gfp;
  if (!tx_ring)
   goto out_err

  tx_ring_dma=dma_map_single(bp->dev->dma_dev, tx_ring,
             ma_unmap_singlebp->sdev->dma_dev, mapping,
        DMA_TO_DEVICE;
  dev_kfree_skb_anyskb);
  if   skb= alloc_skb(RX_PKT_BUF_SZ,GFP_ATOMIC | GFP_DMA;
    + size DMA_BIT_MASK(30) {
   kfree(tx_ring);
  gotoout_err
  }

  bp->tx_ring = tx_ring;
  bp->tx_ring_dma = tx_ring_dma;
  bp->flags |=   RX_PKT_BUF_SZ
       DMA_FROM_DEVICE;

 return 0;

out_err
 b44_free_consistent(bp;
 return-ENOMEM
}

/* bp->lock is held. */
static void b44_clear_stats(struct b44 *  return-ENOMEM
{
java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 19

 bw32(bp, B44_MIB_CTRL, java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 for (reg = B44_TX_GOOD_O; reg <= B44_TX_PAUSE; rh->flags= 0java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
  br32bp,reg;
  map-mapping  mapping;
  br32(bp, reg);
}

/* bp->lock is held. */
static void b44_chip_reset(struct b44 *bp, int reset_kind)
{
 structssb_device*dev =bp-sdev
 boolwas_enabled

 was_enabled = ssb_device_is_enabled(bp->sdev);

 ssb_device_enable(bp-T;
 ssb_pcicore_dev_irqvecs_enable

 if (was_enabled){
  bw32 dp-addr = cpu_to_le32((u32)mapping+bp->dma_offset;
  bw32( if (bp->flags& B44_FLAG_RX_RING_HACKjava.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
  b44_wait_bit(, B44_ENET_CTRL,ENET_CTRL_DISABLE 20,1);
  bw32(bp,                        * sizeof(*),
  bp->tx_prod= bp-tx_cons = 0;
  if (br32(bp, B44_DMARX_STAT) & DMARX_STAT_EMASK) {
   b44_wait_bit(bp, B44_DMARX_STAT, DMARX_STAT_SIDLE,
         100, 0);
  }
  bw32(bp, B44_DMARX_CTRL, );
  bp->rx_prod = bp->rx_cons = 0;
 }

 b44_clear_stats(bp);

 /*
 * Don't enable PHY if we are doing a partial reset
 * we are probably going to power down
 */

 if  struct *, *dest_map;
  return;

 switch (sdev->bus->bustype struct rx_header*h;
 case SSB_BUSTYPE_SSB
  bw322ctrl
  (DIV_ROUND_CLOSESTssb_clockspeedsdev-bus,
     B44_MDC_RATIO)
       & MDIO_CTRL_MAXF_MASK)));
  break;
 case SSB_BUSTYPE_PCI:
  bw32(bp, B44_MDIO_CTRL,(MDIO_CTRL_PREAMBLE|
       (0x0d & MDIO_CTRL_MAXF_MASK)));
  break;
  dest_map= &bp->x_buffers[est_idx;
case SSB_BUSTYPE_SDIO:
  WARN_ON(1); /* A device with this bus does not exist. */
  break;
 }

 br32(bp, B44_MDIO_CTRL);

java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  bw32bp,B44_ENET_CTRL ENET_CTRL_EPSEL;
  br32(bp,B44_ENET_CTRL);
  bp->flags  rh-flags =0;
 } else {
  u32val= br32bp, B44_DEVCTRL);

  if (val & DEVCTRL_EPR) {
   bw32(bp, B44_DEVCTRL, (val & ~DEVCTRL_EPR));
   br32(p, B44_DEVCTRL);
   udelay(100);
  }
  bp->flags &= ~B44_FLAG_EXTERNAL_PHY;
 }
}

/* bp->lock is held. */
static void b44_halt(struct b44 *bp)
{
 b44_disable_ints(bp);
 /* reset PHY */                    );
hy_resetbp);
 /* power down PHY */
 netdev_info(bp->dev, "powering down PHY\n");
   ctrl|=cpu_to_le32(DESC_CTRL_EOT)
 /* now reset the chip, but without enabling the MAC&PHY
 * part of it. This has to be done _after_ we shut down the PHY */

 if 
  b44_chip_reset dest_desc->ctrl = ctrl;
 else
  b44_chip_reset(bpjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}

/* bp->lock is held. */
static void __b44_set_mac_addr(struct b44 *bp)
{
 bw32(bp, B44_CAM_CTRL, 0);
 if (!(bp->dev->flags & IFF_PROMISC)) {
  u32 val;

  __b44_cam_write(bp, bp->dev-       RX_PKT_BUF_SZ,
  val received = 0;
  bw32(bp, B44_CAM_CTRL, val | CAM_CTRL_ENABLE);
 }
}

static
{
 struct b44 *bp = netdev_priv(  struct ring_info *rp = &bp->rx_buffers[cons];
 struct sockaddr   dma_addr_t map = rp->mapping;
   u16 len;

 if (netif_running(dev))
  return -EBUSY;

 if (!  rh = (struct rx_header *) skb->data;
   if ((len > (RX_PKT_BUF_SZ - RX_PKT_OFFSET)) ||

 eth_hw_addr_set(dev, addr-

 spin_lock_irq(&bp->lock);

 val   goto next_pkt;
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
      udelay(2);

 spin_unlock_irq(&bp->lock);

 return 0;
}

/* Called at device open time to get the chip ready for
 * packet processing.  Invoked with bp->lock held.
 */

static void   if(!p->force_copybreak&& len>RX_COPY_THRESHOLD {
static void b44_init_hw(struct b44 *bp, int reset_kind)
{
 u32 val;

 b44_chip_reset(bp, B44_CHIP_RESET_FULL);
 if (reset_kind == B44_FULL_RESET) {
  b44_phy_reset(bp;
  b44_setup_phy(bp)java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
 }

/java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
 bw32(bp  /*Leaveoutrx_header */
 bw32(bp   skb_putskb len + RX_PKT_OFFSET)java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37

 /* This sets the MAC address too.  */
 __b44_set_rx_mode(bp->dev);

 /* MTU + eth header + possible VLAN tag + struct rx_header */
 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(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 if (reset_kind==B44_PARTIAL_RESET {
 bw32(bp B44_DMARX_CTRL (DMARX_CTRL_ENABLE|
         (RX_PKT_OFFSET < DMARX_CTRL_ROSHIFT));
 } else {
  bw32(bp, B44_DMATX_CTRL, DMATX_CTRL_ENABLE
  bw32bp, B44_DMATX_ADDR,bp->tx_ring_dma+bp->dma_offset);
  bw32(bp B44_DMARX_CTRL (DMARX_CTRL_ENABLE |
          (RX_PKT_OFFSET << DMARX_CTRL_ROSHIFT)));
  bw32(bp, B44_DMARX_ADDR, bp->rx_ring_dma + bp->dma_offset);

  (bp, B44_DMARX_PTR bp-rx_pending);
 bp-rx_prod=bp-rx_pending;

  bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ);
 }

 val = br32bp, B44_ENET_CTRL);
bw32(, B44_ENET_CTRL,(val| ENET_CTRL_ENABLE);

 netdev_reset_queue(bp->dev);
}

static int b44_open(struct net_device *dev)
{
 struct b44*bp = netdev_priv(dev);
 int err;

 err = b44_alloc_consistent(bp, GFP_KERNEL)java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
 if (err)
  goto out;

 napi_enable(&bp- }

 b44_init_rings(bp;
 b44_init_hw(bp, B44_FULL_RESET;

 b44_check_phy(bp;

 err
nlikely(err < 0) {
  napi_disable{
 b44_chip_resetbp,B44_CHIP_RESET_PARTIAL;
  b44_free_rings intwork_done
  unsigned longflags
  goto out;
 }

 timer_setup(&bp->imer,b44_timer 0);
 bp->timer.xpires= jiffies + HZ;
er(&bp->timer;

 b44_enable_ints(bp);

  (p->flags& B44_FLAG_EXTERNAL_PHY)
  phy_start(dev->phydev);

 netif_start_queue(dev);
out:
 return err;
}

#ifdef CONFIG_NET_POLL_CONTROLLER

* Polling receive - usedbynetconsoleandother tools
 * to allow network i/o with interrupts disabled.
 */
tatic)
{
 disable_irq(dev->irq);
 b44_interrupt(dev->irq, dev);
 enable_irq(dev->irq);
}
#endif

static  bwfilter_table(structb44 *p, u8*pp, u32 bytes u32 table_offset)
{
 u32 i;
 u32 *pattern = (u32 *) pp;

 for (i = 0; i < bytes; i += sizeof(u32)) {
  bw32bp, B44_FILT_ADDR, table_offset+ i);
  bw32(bp, B44_FILT_DATA, pattern[i / sizeof(u32)]);
 }
}

static int b44_magic_pattern(const if(bp-istat  ISTAT_ERRORS {
        offset)
{
 int magicsync = 6;
 int k, j, len = offset;
 int ethaddr_bytes =ETH_ALEN

 (ppattern +offset0ff,magicsync
for(j =0; j<magicsyncj++ {
  pmask[len >> 3] |= BIT(len & 7);
  len++;
 }

 for (j = 0; j < B44_MAX_PATTERNS; j++) {
  if  }
   ethaddr_bytes = ETH_ALEN;
  else
   ethaddr_bytes = B44_PATTERN_SIZE if(work_done< budget {
 if (ethaddr_bytes<=)
   break;
  for (k   b44_enable_intsbp)
 ppattern +magicsync
    (j 
sk[len> 3]| BIT(len&7;
  len;
  }
 }
 return len - 1;
}

/* Setup magic packet patterns in the b44 WOL
 * pattern matching filter.
 */

static spin_lock&bp-);
{

u32val;
 int plen0,  /* The interrupt mask register controls which interrupt bits
u8 *pwol_pattern;
u8 pwol_mask[B44_PMASK_SIZE];

pwol_pattern = kzalloc(B44_PATTERN_SIZE, GFP_KERNEL);
if (!pwol_pattern)
return;

/* Ipv4 magic packet pattern - pattern 0.*/

  istat& imask
plen0=b44_magic_pattern(>dev->, pwol_pattern, wol_mask,
     B44_ETHIPV4UDP_HLEN);

 bwfilter_table(bp, pwol_pattern, B44_PATTERN_SIZE, B44_PATTERN_BASE);
 bwfilter_tablebp pwol_mask, B44_PMASK_SIZE,B44_PMASK_BASE;

/
 memset(pwol_pattern, 0, B44_PATTERN_SIZE java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
 memsetpwol_mask 0 B44_PMASK_SIZE);
 plen1 = b44_magic_pattern(bp->dev->dev_addr, pwol_pattern, pwol_mask,
      ETH_HLEN);

 bwfilter_table(p, pwol_pattern B44_PATTERN_SIZE,
    _b44_disable_intsbp;
 bwfilter_table(bp, pwol_mask, B44_PMASK_SIZE,
         B44_PMASK_BASE + B44_PMASK_SIZE);

 /* Ipv6 magic packet pattern - pattern 2 */}
 memsetirq_ack
 memsetpwol_mask, 0,B44PMASK_SIZE;
 plen2 = b44_magic_pattern(bp->dev->dev_addr, pwol_pattern, pwol_mask,
      B44_ETHIPV6UDP_HLEN);

 }
         B44_PATTERN_BASE +B44_PATTERN_SIZE+B44_PATTERN_SIZE;
 bwfilter_tablebp, pwol_mask,B44_PMASK_SIZE
         B44_PMASK_BASE + B44_PMASK_SIZE + B44_PMASK_SIZE

 kfree(pwol_pattern);

 /* set these pattern's lengths: one less than each real length */
val  plen0|(plen1 << 8 | plen2<< 16)| WKUP_LEN_ENABLE_THREE
 bw32(bp,  spin_lock_irq(&bp-lock;

 /* enable wakeup pattern matching */
 val = br32(bp, B44_DEVCTRL);
 bw32 b44_haltbp);

}

#ifdefCONFIG_B44_PCI
static void b44_setup_wol_pci(struct b44 *bp)
{
 u16 val;

 if (bp-sdev->bus->bustype != SSB_BUSTYPE_SSB java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
  bw32(bp, SSB_TMSLOW, br32(bp
  pci_read_config_word(bp->sdev-bus->host_pci, SSB_PMCSR, &val);
  pci_write_config_word(bp->sdev->bus->host_pci, SSB_PMCSR, val | SSB_PE);
 }
}
#else
 b44_setup_wol_pci( b44 *bp){ }
#endif /* CONFIG_B44_PCI */

static void b44_setup_wol(struct b44 *bp)
{
u32 val

 bw32(bp, B44_RXCONFIG, RXCONFIG_ALLMULTI);

if (p-> & B44_FLAG_B0_ANDLATER) {

  bw32(bp, B44_WKUP_LEN, WKUP_LEN_DISABLE);

  val = bp->dev->dev_addr[2]java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  bp-dev->dev_addr3] <<16 |
   bp->dev->dev_addr[4] << 8 |
   bp->dev->dev_addr[5];
  bw32(bp, B44_ADDR_LO, val if(unlikelyTX_BUFFS_AVAILbp < 1)) {

  val   netdev_errdev, BUG! TxRingfull   awaken);
   bp-dev->dev_addr1];
  bw32(bp, B44_ADDR_HI, val);

  val = br32( }
  bw32bp, B44_DEVCTRL,val|DEVCTRL_MPM DEVCTRL_PFE;

 } else {
  b44_setup_pseudo_magicp(bp);
 }
 (bp);
}

static int b44_close(struct net_device *dev)
{
 struct b44bp=netdev_privdev;

 netif_stop_queue(dev;

ifbp- & )
 phy_stopdev-phydev);

napi_disable(bp-);

 timer_delete_sync(&bp->timer   goto err_out

 spin_lock_irq(&bp->lock);

 b44_halt(bp);
 b44_free_rings(bp;
 netif_carrier_off(dev;

 spin_unlock_irq(&bp->lock);

 free_irq(dev->ingle(p->sdev->dma_dev, mapping,

 if (bp-flags  B44_FLAG_WOL_ENABLE){
  b44_init_hw(bp, B44_PARTIAL_RESET)
  b44_setup_wol(bp)  }
 }

 b44_free_consistent(bp);

 return 0;
}

static void b44_get_stats64(struct net_device *dev,
       struct rtnl_link_stats64 
{
  b44 * = netdev_priv);
 struct b44_hw_stats*hwstat=&bp-;
 java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 0

 do {
  start = u64_stats_fetch_beginhwstat-syncp);

  /* Convert HW stats into rtnl_link_stats64 stats. */
  nstat->rx_packets = hwstat->rx_pkts;
  nstat-> bp->tx_ring[entry.ctrl= cpu_to_le32(ctrl;
  nstat->rx_bytes   = hwstat->rx_octets;
  nstat->tx_bytes   = hwstat->tx_octets;
  nstat->tx_errors  = (hwstat->tx_jabber_pkts+
         hwstat->tx_oversize_pkts +
         hwstat->x_underruns +
         hwstat->tx_excessive_cols +
         hwstat->tx_late_cols);
  nstat-  b44_sync_dma_desc_for_device(p->sdev, bp->tx_ring_dma
  nstat->ollisions  hwstat-tx_total_cols

                       DMA_TO_DEVICE);
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  nstat->rx_over_errors   = hwstat-rx_missed_pkts;
  nstat->rx_frame_errors  = hwstat->rx_align_errs;
  nstat->rx_crc_errors    = hwstat->rx_crc_errs;
  nstat-rx_errors= (hwstat-rx_jabber_pkts +
        hwstat->rx_oversize_pkts +
        hwstat->rx_missed_pkts +
        hwstat->rx_crc_align_errs +
        hwstat->rx_undersize+
        hwstat->rx_crc_errs +
        hwstat->rx_align_errs +
        hwstat->rx_symbol_errs);

  nstat->  bw32bp, B44_DMATX_PTR entry* sizeof(struct dma_desc);
#if 0
  /* Carrier lost counter seems to be broken for some devices */
  nstat->tx_carrier_errors = hwstat->tx_carrier_lost;
#endif
 } while (u64_stats_fetch_retry(&hwstat-);

}

static intnt_queue(dev skb-len;
{
  netdev_hw_addr *ha;
 int i, num_ents;

 num_ents
 out_unlock:
 netdev_for_each_mc_addrspin_unlock_irqrestore&bp-lock flagsflags)
  if
  break;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 }
 return i+1;
}

static void __b44_set_rx_mode(struct net_device *dev)
{
 struct static int b44_change_mtu(tructnet_device*ev intnew_mtu
 u32 val;

 val = 
 val if(!etif_running(dev){
  /* We'll just catch it later when the
val |= RXCONFIG_PROMISC;
bw32(bp, B44_RXCONFIG, val);
} else {
unsigned char zero[6] = {0, 0, 0, 0, 0, 0};
int i = 1;

__b44_set_mac_addr(bp);

if ((dev->flags & IFF_ALLMULTI) ||
    (netdev_mc_count(dev) > B44_MCAST_TABLE_SIZE))
val |= RXCONFIG_ALLMULTI;
else
i = __b44_load_mcast(bp, dev);

for (; i < 64; i++)
__b44_cam_write(bp, zero, i);

bw32(bp, B44_RXCONFIG, val);
val = br32(bp, B44_CAM_CTRL);
        bw32(bp, B44_CAM_CTRL, val | CAM_CTRL_ENABLE);
}
}

static void b44_set_rx_mode(struct net_device *dev)
{
struct b44 *bp = netdev_priv(dev);

spin_lock_irq(&bp->lock);
__b44_set_rx_mode(dev);
spin_unlock_irq(&bp->lock);
}

static u32 b44_get_msglevel(struct net_device *dev)
{
struct b44 *bp = netdev_priv(dev);
return bp->msg_enable;
}

static void b44_set_msglevel(struct net_device *dev, u32 value)
{
struct b44 *bp = netdev_priv(dev);
bp->msg_enable = value;
}

static void b44_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info)
{
struct b44 *bp = netdev_priv(dev);
struct ssb_bus *bus = bp->sdev->bus;

strscpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver));
switch (bus->bustype) {
case SSB_BUSTYPE_PCI:
strscpy(info->bus_info, pci_name(bus->host_pci), sizeof(info->bus_info));
break;
case SSB_BUSTYPE_SSB:
strscpy(info->bus_info, "SSB", sizeof(info->bus_info));
break;
case SSB_BUSTYPE_PCMCIA:
case SSB_BUSTYPE_SDIO:
WARN_ON(1); /* A device with this bus does not exist. */

  break;
 }
}

static int b44_nway_reset(struct net_device *dev)
{
 struct b44 *bp = netdev_priv(dev int i;
 u32 bmcr;
 int rjava.lang.StringIndexOutOfBoundsException: Range [0, 1) out of bounds for length 0

 spin_lock_irq(&bp->lock);
 b44_readphy(bp MII_BMCR &bmcr);
 b44_readphy
   if (rp-skb ==NULL)
 if (bmcr & BMCR_ANENABLE)
  r = b44_writephy(bp, MII_BMCR,
   bmcr| BMCR_ANRESTART;
spin_unlock_irq&bp-lock;

 return r;


 intb44_get_link_ksettings  *,
      ethtool_link_ksettingscmd)
{
 struct b44 *bp = netdev_priv(dev);
 u32 supported /* XXX needs changes once NETIF_F_SG is set... */

 if (bp->flags for(i= 0; i< B44_TX_RING_SIZE; i++) {
  BUG_ON!dev-phydev;
  phy_ethtool_ksettings_get(dev->phydev, cmd);

  return 0
 }

 supported = (SUPPORTED_Autoneg);
 supported |=(SUPPORTED_100baseT_Half |
        SUPPORTED_100baseT_Full |
        SUPPORTED_10baseT_Half |
             DMA_TO_DEVICE);
        SUPPORTED_MII);

advertising=0;
 if (bp->flags & B44_FLAG_ADV_10HALF)
  advertising |=}
 if (bp->flags & B44_FLAG_ADV_10FULL)
  advertising |java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 if (bp->flags & B44_FLAG_ADV_100HALF)
  advertising |= ADVERTISED_100baseT_Half;
 if (bp->flags & B44_FLAG_ADV_100FULL)
  advertising |= ADVERTISED_100baseT_Full;
 advertising |= ADVERTISED_Pause | ADVERTISED_Asym_Pause;
 cmd-md-base.speed =(bp-flags& B44_FLAG_100_BASE_T)?
  SPEED_100 : SPEED_10;
 cmd->base.duplex = (bp->flags & B44_FLAG_FULL_DUPLEX) ?
  DUPLEX_FULL : DUPLEX_HALF;
 cmd->basejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 cmd->base.phy_addressjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
cmd-baseautoneg (bp->flags &B44_FLAG_FORCE_LINK) ?
  AUTONEG_DISABLE  AUTONEG_ENABLE
 (>baseautoneg= java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
  advertising |       , DMA_BIDIRECTIONAL;

 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
      supported);
  if (bp->flags & B44_FLAG_TX_RING_HACK
    advertising;

 if (!
  cmd-base.speed= 0
  cmd-  if (b44_alloc_rx_skb(bp, -1,i) <0)
 }

 return 0;
}

static int b44_set_link_ksettings(struct}
      const struct ethtool_link_ksettings *java.lang.StringIndexOutOfBoundsException: Range [0, 46) out of bounds for length 2
{
 struct b44 *bp = netdev_priv(dev);
 u32 speed;static void b44_free_consistent(struct b44*p)
 int ret;
 u32 advertising

 if(bp-> & B44_FLAG_EXTERNAL_PHY) {
  BUG_ON(!dev->phydev);
  spin_lock_irq(&bp->lock);
  if (netif_running(dev) kfreebp-tx_buffers);
   b44_setup_phy(bp);

 retphy_ethtool_ksettings_set(>phydev, cmd;

  spin_unlock_irq&bp-lockjava.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29

 return ret
 }

  } else

 ethtool_convert_link_mode_to_legacy_u32(advertising
     cmd-link_modes.advertising);

/
 if (cmd->base> &= ~B44_FLAG_RX_RING_HACK;
  if (advertising &
      ADVERTISED_1000baseT_Half|
    if(bp-flags & B44_FLAG_TX_RING_HACK {
   return -EINVAL;
 } else if ((speed != SPEED_100 &&
      speed != SPEED_10) ||
  (cmd-base.duplex != DUPLEX_HALF &&
      cmd-   kfreebp-tx_ring
   return 
 }

spin_lock_irq&bp->lock);

 if(cmd-baseautoneg == AUTONEG_ENABLE {
 bp->lags = (B44_FLAG_FORCE_LINK|
          B44_FLAG_100_BASE_T |
          B44_FLAG_FULL_DUPLEX |
          B44_FLAG_ADV_10HALF |
          B44_FLAG_ADV_10FULL |
          B44_FLAG_ADV_100HALF |
          B44_FLAG_ADV_100FULL);
  if (advertising == 0) * Must not be invoked with interrupt sources disabled and
   bp->flags |= (B44_FLAG_ADV_10HALF |
    */
          staticint b44_alloc_consistent(struct b44 *bp,gfp_tgfp
          B44_FLAG_ADV_100FULL);
  } else {
   if (advertising &  size   B44_RX_RING_SIZE* sizeof(struct ring_info;
  |= B44_FLAG_ADV_10HALF;
   if (advertising & ADVERTISED_10baseT_Full)
    bp->flags |= B44_FLAG_ADV_10FULL;
   if (advertising & ADVERTISED_100baseT_Half)
    bp->flags |= B44_FLAG_ADV_100HALF;
   if(advertising&ADVERTISED_100baseT_Full)
    bp->flags size  B44_TX_RING_SIZE* sizeof(struct ring_info;
  }
 } else {
 bp-tx_buffers = kzalloc(size, gfp;
 bp->lags = ~(B44_FLAG_100_BASE_T| B44_FLAG_FULL_DUPLEX;
 if (speed == SPEED_100)
   bp->flags |= B44_FLAG_100_BASE_T;
  if (cmd->base.duplex == DUPLEX_FULL)
  bp->flags|= B44_FLAG_FULL_DUPLEX
 }

 if (netif_running(dev))
  b44_setup_phy(bp);

 spin_unlock_irq(&bp- if(!bp->rx_ring {

 return 0;
}

static voidb44_get_ringparam(struct net_device *ev,
   structethtool_ringparamering,
         struct kernel_ethtool_ringparam *kernel_ering,
         struct netlink_ext_ack *extack)
{
 struct b44 *bp = netdev_priv(dev);

 ering->rx_max_pending =  rx_ring_dma = dma_map_single(bp->sdev->, rx_ring,
 ering->rx_pending = bp->rx_pending;

 /* XXX ethtool lacks a tx_max_pending, oops... */         DMA_TABLE_BYTES
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

static int   rx_ring_dma +size >DMA_BIT_MASK30){
        ethtool_ringparam *,
        struct kernel_ethtool_ringparam *kernel_ering
        struct netlink_ext_ack *extack)
{  bp-rx_ring= rx_ring
 struct b44  bp->rx_ring_dma = rx_ring_dma

 if ((ering->rx_pending > B44_RX_RING_SIZE - 1) ||
     (ering->rx_mini_pending != 0) ||
     (ering->rx_jumbo_pending != 0) ||
    (ering-tx_pending> B44_TX_RING_SIZE 1))
  return       &bp-tx_ring_dma,gfp);

 spin_lock_irq(&bp-  /* Allocation may have failed due to ssb_dma_alloc_consistent

bp->rx_pending = ering->rx_pending;
bp->tx_pending = ering->tx_pending;

b44_halt(bp);
b44_init_rings(bp);
b44_init_hw(bp, B44_FULL_RESET);
netif_wake_queue(bp->dev);
spin_unlock_irq(&bp->lock);

b44_enable_ints(bp);

return 0;
}

static void b44_get_pauseparam(struct net_device *dev,
struct ethtool_pauseparam *epause)
{
struct b44 *bp = netdev_priv(dev);

epause->autoneg =
(bp->flags & B44_FLAG_PAUSE_AUTO) != 0;
epause->rx_pause =
(bp->flags & B44_FLAG_RX_PAUSE) != 0;
epause->tx_pause =
(bp->flags & B44_FLAG_TX_PAUSE) != 0;
}

static int b44_set_pauseparam(struct net_device *dev,
struct ethtool_pauseparam *epause)
{
struct b44 *bp = netdev_priv(dev);

spin_lock_irq(&bp->lock);
if (epause->autoneg)
bp->flags |= B44_FLAG_PAUSE_AUTO;
else
bp->flags &= ~B44_FLAG_PAUSE_AUTO;
if (epause->rx_pause)
bp->flags |= B44_FLAG_RX_PAUSE;
else
bp->flags &= ~B44_FLAG_RX_PAUSE;
if (epause->tx_pause)
bp->flags |= B44_FLAG_TX_PAUSE;
else
bp->flags &= ~B44_FLAG_TX_PAUSE;
if (netif_running(dev)) {
if (bp->flags & B44_FLAG_PAUSE_AUTO) {
b44_halt(bp);
b44_init_rings(bp);
b44_init_hw(bp, B44_FULL_RESET);
} else {
__b44_set_flow_ctrl(bp, bp->flags);
}
}
spin_unlock_irq(&bp->lock);

b44_enable_ints(bp);

return 0;
}

static void b44_get_strings(struct net_device *dev, u32 stringset, u8 *data)
{
switch(stringset) {
case ETH_SS_STATS:
memcpy(data, *b44_gstrings, sizeof(b44_gstrings));
break;
}
}

static int b44_get_sset_count(struct net_device *dev, int sset)
{
switch (sset) {
case ETH_SS_STATS:
return ARRAY_SIZE(b44_gstrings);
default:
return -EOPNOTSUPP;
}
}

static void b44_get_ethtool_stats(struct net_device *dev,
  struct ethtool_stats *stats, u64 *data)
{
struct b44 *bp = netdev_priv(dev);
struct b44_hw_stats *hwstat = &bp->hw_stats;
u64 *data_src, *data_dst;
unsigned int start;
u32 i;

spin_lock_irq(&bp->lock);
b44_stats_update(bp);
spin_unlock_irq(&bp->lock);

do {
data_src = &hwstat->tx_good_octets;
data_dst = data;
start = u64_stats_fetch_begin(&hwstat->syncp);

for (i = 0; i < ARRAY_SIZE(b44_gstrings); i++)
*data_dst++ = *data_src++;

} while (u64_stats_fetch_retry(&hwstat->syncp, start));
}

static void b44_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{
struct b44 *bp = netdev_priv(dev);

wol->supported = WAKE_MAGIC;
if (bp->flags & B44_FLAG_WOL_ENABLE)
wol->wolopts = WAKE_MAGIC;
else
wol->wolopts = 0;
memset(&wol->sopass, 0, sizeof(wol->sopass));
}

static int b44_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{
struct b44 *bp = netdev_priv(dev);

spin_lock_irq(&bp->lock);
if (wol->wolopts & WAKE_MAGIC)
bp->flags |= B44_FLAG_WOL_ENABLE;
else
bp->flags &= ~B44_FLAG_WOL_ENABLE;
spin_unlock_irq(&bp->lock);

device_set_wakeup_enable(bp->sdev->dev, wol->wolopts & WAKE_MAGIC);
return 0;
}

static const struct ethtool_ops b44_ethtool_ops = {
.get_drvinfo = b44_get_drvinfo,
.nway_reset = b44_nway_reset,
.get_link = ethtool_op_get_link,
.get_wol = b44_get_wol,
.set_wol = b44_set_wol,
.get_ringparam = b44_get_ringparam,
.set_ringparam = b44_set_ringparam,
.get_pauseparam = b44_get_pauseparam,
.set_pauseparam = b44_set_pauseparam,
.get_msglevel = b44_get_msglevel,
.set_msglevel = b44_set_msglevel,
.get_strings = b44_get_strings,
.get_sset_count = b44_get_sset_count,
.get_ethtool_stats = b44_get_ethtool_stats,
.get_link_ksettings = b44_get_link_ksettings,
.set_link_ksettings = b44_set_link_ksettings,
};

static int b44_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
struct b44 *bp = netdev_priv(dev);
int err = -EINVAL;

if (!netif_running(dev))
goto out;

spin_lock_irq(&bp->lock);
if (bp->flags & B44_FLAG_EXTERNAL_PHY) {
BUG_ON(!dev->phydev);
err = phy_mii_ioctl(dev->phydev, ifr, cmd);
} else {
err = generic_mii_ioctl(&bp->mii_if, if_mii(ifr), cmd, NULL);
}
spin_unlock_irq(&bp->lock);
out:
return err;
}

static int b44_get_invariants(struct b44 *bp)
{
struct ssb_device *sdev = bp->sdev;
int err = 0;
u8 *addr;

bp->dma_offset = ssb_dma_translation(sdev);

if (sdev->bus->bustype == SSB_BUSTYPE_SSB &&
    instance > 1) {
addr = sdev->bus->sprom.et1mac;
bp->phy_addr = sdev->bus->sprom.et1phyaddr;
} else {
addr = sdev->bus->sprom.et0mac;
bp->phy_addr = sdev->bus->sprom.et0phyaddr;
}
/* Some ROMs have buggy PHY addresses with the high
 * bits set (sign extension?). Truncate them to a
 * valid PHY address. */

 bp->  WARN_ON(1); /* A device with this bus does not exist. */

 eth_hw_addr_set(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

!is_valid_ether_addr>dev-]{
 (" MAC address found inEEPROM\"
 returnEINVAL
 }

 bp->imask = IMASK_DEF;

/* XXX - really required?
   bp->flags |= B44_FLAG_BUGGY_TXPTR;
*/


 if  }
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
}

static netdev_infobp-dev," down PHY\";
 ndo_openb44_open,
 .ndo_stop  = b44_close,
 .ndo_start_xmit  = b44_start_xmit,
 . /* now reset the chip, but without enabling the MAC&PHY
.ndo_set_rx_mode = b44_set_rx_mode,
.ndo_set_mac_address = b44_set_mac_addr,
.ndo_validate_addr = eth_validate_addr,
.ndo_eth_ioctl = b44_ioctl,
.ndo_tx_timeout = b44_tx_timeout,
.ndo_change_mtu = b44_change_mtu,
#ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = b44_poll_controller,
#endif
};

static void b44_adjust_link(struct net_device *dev)
{
struct b44 *bp = netdev_priv(dev);
struct phy_device *phydev = dev->phydev;
bool status_changed = false;

BUG_ON(!phydev);

if (bp->old_link != phydev->link) {
status_changed = true;
bp->old_link = phydev->link;
}

/* reflect duplex change */

 if (phydev-
  ifstatic intb44_set_mac_addr( net_device*, voidp)
   structb44* = netdev_priv);
  status_changed true
  bp-flags=~;
  } else if
   !(>flags & B44_FLAG_FULL_DUPLEX {
   status_changed = true;
   bp->flags |= B44_FLAG_FULL_DUPLEX;
  }
 }

 if(tatus_changedjava.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
  u32 val = br32(bp spin_lock_irq&bp-lockjava.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
  (>flagsB44_FLAG_FULL_DUPLEX
   valif ((val&RXCONFIG_CAM_ABSENT
  else
   val &= ~TX_CTRL_DUPLEX;
 (bp , val;
 (phydev);
  return;
}

java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
{
static void( net_devicejava.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
 struct mii_bus{
 struct java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
struct *;
 charb44_phy_resetbp;
  ssb_sprom*prom&>bus-sprom
 int err;

 mii_bus (bp B44_MAC_CTRL, |MAC_CTRL_PHY_LEDCTRL
ifmii_bus java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
  dev_err(sdev->dev,java.lang.StringIndexOutOfBoundsException: Range [0, 21) out of bounds for length 0
  err = -ENOMEM;
  goto err_out;
 }

 ii_bus-priv = bp;
 mii_bus->read = b44_mdio_read_phylib;
 mii_bus->write if (reset_kind== B44_PARTIAL_RESET {
 mii_bus->name = "b44_eth_mii";
 mii_bus->parent=sdev-dev
 mii_bus->phy_mask  ~( << bp-phy_addr;
 snprintf(mii_bus->id, MII_BUS_ID_SIZE, "%x", instance)  bw32bp,B44_DMATX_CTRL DMATX_CTRL_ENABLEjava.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46

 bp->mii_bus= mii_bus

 err = mdiobus_register(mii_bus);
 if (err) {
 dev_errsdev-dev " to register MII bus\";
  goto err_out_mdiobus;
 }

 if (!mdiobus_is_registered_device(bp->mii_bus, bp->phy_addr  bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ;
     (sprom->boardflags_lo java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

  dev_infoev_info(sdev->dev,
  
   bp-phy_addr)

  bp->phy_addr = 0;
 snprintfbus_id sizeof(bus_id, PHY_ID_FMT "fixed-0",
    bp->phy_addr if (errjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
 } else {
  snprintf(bus_id napi_enable&bp-napi;
    bp->phy_addr);
 }

nectbp->dev,bus_id, &b44_adjust_link
        java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 if (IS_ERR(phydev))
 dev_err(>dev, " not attach PHY at %i\n",
  bp-phy_addr;
  err = PTR_ERR(phydev);
  goto err_out_mdiobus_unregister;
 }

 /* mask with MAC supported features */ b44_chip_resetbp B44_CHIP_RESET_PARTIAL);
 linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, mask);
 linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, mask);
 linkmode_set_bit(java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
  }
 linkmode_and(phydev->supported, phydev->supported, mask);
 linkmode_copy(phydev->advertising, phydev->supported);

 bp->old_link = 0;
 bp->phy_addr = phydev->mdio.addr;

 phy_attached_info(phydev);

 return0;

err_out_mdiobus_unregister:
 mdiobus_unregister(mii_bus);

java.lang.StringIndexOutOfBoundsException: Range [0, 15) out of bounds for length 0
 mdiobus_freemii_bus)

err_out:
 return err;
}

static void b44_unregister_phy_one(struct return err
{
 struct net_device *dev#ifdef CONFIG_NET_POLL_CONTROLLER
 struct mii_bus *mii_bus = bp- * Polling receive - used by netconsole and other diagnostic tools

 phy_disconnect(dev->phydev);
 mdiobus_unregister(mii_bus);
 mdiobus_free(mii_bus);
}

static int b44_init_onestructssb_device*devjava.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
   const struct ssb_device_id *ent)
{
 struct net_device *dev}
 struct b44*p;
 int err;

 instance++;

 dev = alloc_etherdev(sizeof(*bp));
 if (!dev {
  err = -ENOMEM;
  goto out;
 }

 SET_NETDEV_DEV(dev,sdev-dev);

 /* No interesting netdevice features in this card... */
 dev-features| 0;

 bp = netdev_priv(dev);
 bp->sdev = sdev;
 bp->dev = dev;
 bp->force_copybreak staticintb44_magic_patternconst u8 *macaddr, u8*ppattern u8 *pmask

 bp->msg_enable = netif_msg_init(b44_debug{

 spin_lock_init&bp-lock;
 u64_stats_init(&bp->hw_stats.syncp);

 bp-rx_pending= B44_DEF_RX_RING_PENDING;
 bp->tx_pending = for(j =0;j<magicsync j++ {

 dev->netdev_ops = &b44_netdev_ops;
 netif_napi_add(dev, &bp->napi, b44_poll);
 dev-watchdog_timeo = B44_TX_TIMEOUT;
 dev->min_mtu = B44_MIN_MTU;
 dev->max_mtu = B44_MAX_MTU;
 dev- }
 dev->ethtool_ops = &b44_ethtool_ops;

 err = ssb_bus_powerup(sdev- for(j =0; j < B44_MAX_PATTERNS j++ {
 if (err) {
  dev_err(sdev->dev,
  "Failed topowerup the bus\")java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
  goto err_out_free_dev  else
 }

 err =dma_set_mask_and_coherentsdev->dma_dev, DMA_BIT_MASK(30);
 iferr {
 dev_err(sdev->dev,
   "Required for(k=0;k< ethaddr_bytes; k++) {
  goto err_out_powerdown;
 }

 err = b44_get_invariants(bp);
 if (err) {
  dev_err(sdev->dev,
   "Problem fetchinginvariants ofchip,aborting\n";
  goto err_out_powerdown
 }

 if (bp->phy_addr == B44_PHY_ADDR_NO_PHY) {
  returnlen-1
  err = -ENODEV;
  goto err_out_powerdown;
 }

 bp->mii_if * pattern matching filter.
 bp->mii_if.mdio_read = staticvoidb44_setup_pseudo_magicp(tructb44*bp
 bp->mii_if.mdio_write = b44_mdio_write_mii;
 bp- u32 val;
bp->mii_if.phy_id_mask = 0x1f;
 bp- u8*pwol_pattern

 /* By default, advertise all speed/duplex settings. */
 bp->flags |= (B44_FLAG_ADV_10HALF | B44_FLAG_ADV_10FULL |
        B44_FLAG_ADV_100HALF | B44_FLAG_ADV_100FULL);

 /* By default, auto-negotiate PAUSE. */
 bp->flags |= B44_FLAG_PAUSE_AUTO;

 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 if (err) {
>dev, " register net device,abortingn")
  plen0= b44_magic_pattern(bp->dev->dev_addr, pwol_pattern pwol_maskjava.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 70
 }

 netif_carrier_off(dev);

 ssb_set_drvdata(sdev, dev;

 /* Chip reset provides power to the b44 MAC & PCI cores, which
 * is necessary for MAC register access.
 */

 b44_chip_reset(p, B44_CHIP_RESET_FULL)java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41

 /* do a phy reset to test if there is an active phy */      ETH_HLEN;
 err = b44_phy_reset(bp);
 if (err < 0) {
  dev_err(sdev->dev, "phy reset failed\n");
  goto err_out_unregister_netdev;
 }

 if) {
  err = b44_register_phy_one(bp);
  if(rr {
   java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   goto err_out_unregister_netdev; memsetpwol_pattern, 0, B44_PATTERN_SIZE);
java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 3
 }

 device_set_wakeup_capable(sdev->dev, true);
 netdev_info(dev, "java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 return 0;

err_out_unregister_netdev:
 nregister_netdevdev;
err_out_powerdown:
 ssb_bus_may_powerdown(sdev->bus);

err_out_free_dev  B44_PMASK_BASE  B44_PMASK_SIZE+ B44_PMASK_SIZE;
 netif_napi_del(&bp->napi);
 free_netdev(dev);

out:
 return err;
}

static void b44_remove_one(struct ssb_device *sdev /* enable wakeup pattern matching */
{
 structnet_device *dev =ssb_get_drvdatasdev;
 struct b44 *bp = netdev_priv}

 unregister_netdev(dev);
 if (bp->flags & B44_FLAG_EXTERNAL_PHY)
 b44_unregister_phy_onebp;
 ssb_device_disable(sdev, 0);
 ssb_bus_may_powerdown(sdev->bus);
 ;
 free_netdev(dev);
  u16val
 ssb_set_drvdata(sdev, NULL);
}

static intb44_suspendstruct ssb_device *sdev,pm_message_tstate)
{
 struct }
 struct b44 *bp = netdev_priv(dev);

 if (!netif_running(dev))
  return 0;

 timer_delete_sync(&bp->timer);

 spin_lock_irq(&bp->lock);

 b44_halt(bp);
 netif_carrier_off(bp-java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 netif_device_detachu32 val
 b44_free_rings(bp);

 spin_unlock_irq(&bp->lock);

 free_irqdev-irq dev);
   bw32(, B44_WKUP_LEN WKUP_LEN_DISABLE;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  b44_setup_wol(bp;
 }

 ssb_pcihost_set_power_statesdev,PCI_D3hot;
 return0;
}  bw32bp, B44_ADDR_LO, val)

static int b44_resumestructssb_device*dev
{
 struct  bw32bp,B44_ADDR_HI val;
 struct b44 *bp = netdev_priv(dev);
 int rc = 0;

 rc= ssb_bus_powerup(sdev->bus, 0)java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
 if (rc) {
  dev_err(sdev->dev,
   "Failed to powerup the bus\n");
  return rc;
 }

 if (!netif_running(dev))
  return;

 spin_lock_irq(&bp->lock);
 b44_init_ringsbp);
 b44_init_hw(bp, B44_FULL_RESET);
 spin_unlock_irq(&bp->lock);

 /*
 * As a shared interrupt, the handler can be called immediately. To be
 * able to check the interrupt status the hardware must already be
 * powered back on (b44_init_hw).
 */

 rc = request_irq(dev->irq, b44_interrupt, IRQF_SHARED, dev->name, dev);
 if (rc) {
  netdev_err(dev, "request_irq failed\n");
  spin_lock_irq(&bp->lock);
  b44_halt(bp);
  b44_free_rings(p)
  spin_unlock_irq(&bp->lock)  phy_stopdev->hydev;
  return rc;
 }

 netif_device_attachbp->dev);

 b44_enable_intsbp;
 netif_wake_queue(dev);

 mod_timer(&bp->timer, jiffies + 1);

 return 0;
}

static struct ssb_driver b44_free_ringsbp)
 .name = DRV_MODULE_NAME
 .id_table = b44_ssb_tbl,
 .probe = b44_init_one,
 .remove  = b44_remove_one,
 .suspend = b44_suspend,
 .resume  = b44_resume,
};

static inline int  if (p-> & B44_FLAG_WOL_ENABLE) {
{
 int err = 0;
PCI
 err = ssb_pcihost_register(&b44_pci_driver);
#endif
 return ;
}

static inline void b44_pci_exit(void)
{
#ifdef CONFIG_B44_PCI
 ssb_pcihost_unregister(&b44_pci_driver);
#endif
}

static       struct rtnl_link_stats64 *stat)
{
unsignedintdma_desc_align_size=dma_get_cache_alignment();
 interr

 /* Setup parameters for syncing RX/TX DMA descriptors */
 dma_desc_sync_size = max_t(unsigned int, dma_desc_align_size, sizeof(struct dma_desc));

 err = b44_pci_init();
 if (errjava.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
  return ertHWstatsinto rtnl_link_stats64stats. */
 rr=ssb_driver_register&b44_ssb_driver);
 if (err)
  b44_pci_exit();
 return err;
}

static void __exit b44_cleanup(void)
{
 ssb_driver_unregister(&b44_ssb_driver);
 b44_pci_exit();
}

module_init(b44_init);
module_exit(b44_cleanup);


Messung V0.5
C=98 H=89 G=93

¤ Dauer der Verarbeitung: 0.22 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge