···6969 device to be used as both a tty interface and as a synchronous 7070 controller is a project for Linux post the 2.4 release7171 </para>7272- <para>7373- The support code handles most common card configurations and7474- supports running both Cisco HDLC and Synchronous PPP. With extra7575- glue the frame relay and X.25 protocols can also be used with this7676- driver.7777- </para>7872 </chapter>79738074 <chapter id="Driver_Modes">···173179 <para>174180 If you wish to use the network interface facilities of the driver,175181 then you need to attach a network device to each channel that is176176- present and in use. In addition to use the SyncPPP and Cisco HDLC182182+ present and in use. In addition to use the generic HDLC177183 you need to follow some additional plumbing rules. They may seem 178184 complex but a look at the example hostess_sv11 driver should179185 reassure you.180186 </para>181187 <para>182188 The network device used for each channel should be pointed to by183183- the netdevice field of each channel. The dev-> priv field of the189189+ the netdevice field of each channel. The hdlc-> priv field of the184190 network device points to your private data - you will need to be185185- able to find your ppp device from this. In addition to use the186186- sync ppp layer the private data must start with a void * pointer187187- to the syncppp structures.191191+ able to find your private data from this.188192 </para>189193 <para>190194 The way most drivers approach this particular problem is to191195 create a structure holding the Z8530 device definition and192192- put that and the syncppp pointer into the private field of193193- the network device. The network device fields of the channels194194- then point back to the network devices. The ppp_device can also195195- be put in the private structure conveniently.196196+ put that into the private field of the network device. The197197+ network device fields of the channels then point back to the198198+ network devices.196199 </para>197200 <para>198198- If you wish to use the synchronous ppp then you need to attach199199- the syncppp layer to the network device. You should do this before200200- you register the network device. The201201- <function>sppp_attach</function> requires that the first void *202202- pointer in your private data is pointing to an empty struct203203- ppp_device. The function fills in the initial data for the204204- ppp/hdlc layer.201201+ If you wish to use the generic HDLC then you need to register202202+ the HDLC device.205203 </para>206204 <para>207205 Before you register your network device you will also need to···300314 buffer in sk_buff format and queues it for transmission. The301315 caller must provide the entire packet with the exception of the302316 bitstuffing and CRC. This is normally done by the caller via303303- the syncppp interface layer. It returns 0 if the buffer has been 304304- queued and non zero values for queue full. If the function accepts 305305- the buffer it becomes property of the Z8530 layer and the caller 306306- should not free it. 317317+ the generic HDLC interface layer. It returns 0 if the buffer has been318318+ queued and non zero values for queue full. If the function accepts319319+ the buffer it becomes property of the Z8530 layer and the caller320320+ should not free it.307321 </para>308322 <para>309323 The function <function>z8530_get_stats</function> returns a pointer
+11
arch/sh/include/asm/sh_eth.h
···11+#ifndef __ASM_SH_ETH_H__22+#define __ASM_SH_ETH_H__33+44+enum {EDMAC_LITTLE_ENDIAN, EDMAC_BIG_ENDIAN};55+66+struct sh_eth_plat_data {77+ int phy;88+ int edmac_endian;99+};1010+1111+#endif
-4
drivers/char/pcmcia/synclink_cs.c
···232232233233 /* SPPP/Cisco HDLC device parts */234234 int netcount;235235- int dosyncppp;236235 spinlock_t netlock;237236238237#if SYNCLINK_GENERIC_HDLC···458459459460static int debug_level = 0;460461static int maxframe[MAX_DEVICE_COUNT] = {0,};461461-static int dosyncppp[MAX_DEVICE_COUNT] = {1,1,1,1};462462463463module_param(break_on_load, bool, 0);464464module_param(ttymajor, int, 0);465465module_param(debug_level, int, 0);466466module_param_array(maxframe, int, NULL, 0);467467-module_param_array(dosyncppp, int, NULL, 0);468467469468MODULE_LICENSE("GPL");470469···29122915 if (info->line < MAX_DEVICE_COUNT) {29132916 if (maxframe[info->line])29142917 info->max_frame_size = maxframe[info->line];29152915- info->dosyncppp = dosyncppp[info->line];29162918 }2917291929182920 mgslpc_device_count++;
-4
drivers/char/synclink.c
···304304305305 /* generic HDLC device parts */306306 int netcount;307307- int dosyncppp;308307 spinlock_t netlock;309308310309#if SYNCLINK_GENERIC_HDLC···867868static int dma[MAX_ISA_DEVICES];868869static int debug_level;869870static int maxframe[MAX_TOTAL_DEVICES];870870-static int dosyncppp[MAX_TOTAL_DEVICES];871871static int txdmabufs[MAX_TOTAL_DEVICES];872872static int txholdbufs[MAX_TOTAL_DEVICES];873873···877879module_param_array(dma, int, NULL, 0);878880module_param(debug_level, int, 0);879881module_param_array(maxframe, int, NULL, 0);880880-module_param_array(dosyncppp, int, NULL, 0);881882module_param_array(txdmabufs, int, NULL, 0);882883module_param_array(txholdbufs, int, NULL, 0);883884···42554258 if (info->line < MAX_TOTAL_DEVICES) {42564259 if (maxframe[info->line])42574260 info->max_frame_size = maxframe[info->line];42584258- info->dosyncppp = dosyncppp[info->line];4259426142604262 if (txdmabufs[info->line]) {42614263 info->num_tx_dma_buffers = txdmabufs[info->line];
-5
drivers/char/synclink_gt.c
···128128static int ttymajor;129129static int debug_level;130130static int maxframe[MAX_DEVICES];131131-static int dosyncppp[MAX_DEVICES];132131133132module_param(ttymajor, int, 0);134133module_param(debug_level, int, 0);135134module_param_array(maxframe, int, NULL, 0);136136-module_param_array(dosyncppp, int, NULL, 0);137135138136MODULE_PARM_DESC(ttymajor, "TTY major device number override: 0=auto assigned");139137MODULE_PARM_DESC(debug_level, "Debug syslog output: 0=disabled, 1 to 5=increasing detail");140138MODULE_PARM_DESC(maxframe, "Maximum frame size used by device (4096 to 65535)");141141-MODULE_PARM_DESC(dosyncppp, "Enable synchronous net device, 0=disable 1=enable");142139143140/*144141 * tty support and callbacks···346349 /* SPPP/Cisco HDLC device parts */347350348351 int netcount;349349- int dosyncppp;350352 spinlock_t netlock;351353#if SYNCLINK_GENERIC_HDLC352354 struct net_device *netdev;···34013405 if (info->line < MAX_DEVICES) {34023406 if (maxframe[info->line])34033407 info->max_frame_size = maxframe[info->line];34043404- info->dosyncppp = dosyncppp[info->line];34053408 }3406340934073410 slgt_device_count++;
-4
drivers/char/synclinkmp.c
···270270271271 /* SPPP/Cisco HDLC device parts */272272 int netcount;273273- int dosyncppp;274273 spinlock_t netlock;275274276275#if SYNCLINK_GENERIC_HDLC···468469 */469470static int debug_level = 0;470471static int maxframe[MAX_DEVICES] = {0,};471471-static int dosyncppp[MAX_DEVICES] = {0,};472472473473module_param(break_on_load, bool, 0);474474module_param(ttymajor, int, 0);475475module_param(debug_level, int, 0);476476module_param_array(maxframe, int, NULL, 0);477477-module_param_array(dosyncppp, int, NULL, 0);478477479478static char *driver_name = "SyncLink MultiPort driver";480479static char *driver_version = "$Revision: 4.38 $";···37493752 if (info->line < MAX_DEVICES) {37503753 if (maxframe[info->line])37513754 info->max_frame_size = maxframe[info->line];37523752- info->dosyncppp = dosyncppp[info->line];37533755 }3754375637553757 synclinkmp_device_count++;
···510510config SH_ETH511511 tristate "Renesas SuperH Ethernet support"512512 depends on SUPERH && \513513- (CPU_SUBTYPE_SH7710 || CPU_SUBTYPE_SH7712 || CPU_SUBTYPE_SH7763)513513+ (CPU_SUBTYPE_SH7710 || CPU_SUBTYPE_SH7712 || CPU_SUBTYPE_SH7763 || \514514+ CPU_SUBTYPE_SH7619)514515 select CRC32515516 select MII516517 select MDIO_BITBANG517518 select PHYLIB518519 help519520 Renesas SuperH Ethernet device driver.520520- This driver support SH7710, SH7712 and SH7763.521521+ This driver support SH7710, SH7712, SH7763 and SH7619.521522522523config SUNLANCE523524 tristate "Sun LANCE support"
+11-8
drivers/net/atlx/atl1.c
···17901790{17911791 struct pci_dev *pdev = adapter->pdev;1792179217931793+ /*17941794+ * The L1 hardware contains a bug that erroneously sets the17951795+ * PACKET_FLAG_ERR and ERR_FLAG_L4_CHKSUM bits whenever a17961796+ * fragmented IP packet is received, even though the packet17971797+ * is perfectly valid and its checksum is correct. There's17981798+ * no way to distinguish between one of these good packets17991799+ * and a packet that actually contains a TCP/UDP checksum18001800+ * error, so all we can do is allow it to be handed up to18011801+ * the higher layers and let it be sorted out there.18021802+ */18031803+17931804 skb->ip_summed = CHECKSUM_NONE;1794180517951806 if (unlikely(rrd->pkt_flg & PACKET_FLAG_ERR)) {···18271816 return;18281817 }1829181818301830- /* IPv4, but hardware thinks its checksum is wrong */18311831- if (netif_msg_rx_err(adapter))18321832- dev_printk(KERN_DEBUG, &pdev->dev,18331833- "hw csum wrong, pkt_flag:%x, err_flag:%x\n",18341834- rrd->pkt_flg, rrd->err_flg);18351835- skb->ip_summed = CHECKSUM_COMPLETE;18361836- skb->csum = htons(rrd->xsz.xsum_sz.rx_chksum);18371837- adapter->hw_csum_err++;18381819 return;18391820}18401821
+2-7
drivers/net/atp.c
···854854 struct net_local *lp = netdev_priv(dev);855855 long ioaddr = dev->base_addr;856856857857- if ( dev->mc_count > 0 || (dev->flags & (IFF_ALLMULTI|IFF_PROMISC))) {858858- /* We must make the kernel realise we had to move859859- * into promisc mode or we start all out war on860860- * the cable. - AC861861- */862862- dev->flags|=IFF_PROMISC;857857+ if (dev->mc_count > 0 || (dev->flags & (IFF_ALLMULTI|IFF_PROMISC)))863858 lp->addr_mode = CMR2h_PROMISC;864864- } else859859+ else865860 lp->addr_mode = CMR2h_Normal;866861 write_reg_high(ioaddr, CMR2, lp->addr_mode);867862}
···2223222322242224/*-------------------------------- Monitoring -------------------------------*/2225222522262226-/*22272227- * if !have_locks, return nonzero if a failover is necessary. if22282228- * have_locks, do whatever failover activities are needed.22292229- *22302230- * This is to separate the inspection and failover steps for locking22312231- * purposes; failover requires rtnl, but acquiring it for every22322232- * inspection is undesirable, so a wrapper first does inspection, and22332233- * the acquires the necessary locks and calls again to perform22342234- * failover if needed. Since all locks are dropped, a complete22352235- * restart is needed between calls.22362236- */22372237-static int __bond_mii_monitor(struct bonding *bond, int have_locks)22262226+22272227+static int bond_miimon_inspect(struct bonding *bond)22382228{22392239- struct slave *slave, *oldcurrent;22402240- int do_failover = 0;22412241- int i;22422242-22432243- if (bond->slave_cnt == 0)22442244- goto out;22452245-22462246- /* we will try to read the link status of each of our slaves, and22472247- * set their IFF_RUNNING flag appropriately. For each slave not22482248- * supporting MII status, we won't do anything so that a user-space22492249- * program could monitor the link itself if needed.22502250- */22512251-22522252- read_lock(&bond->curr_slave_lock);22532253- oldcurrent = bond->curr_active_slave;22542254- read_unlock(&bond->curr_slave_lock);22292229+ struct slave *slave;22302230+ int i, link_state, commit = 0;2255223122562232 bond_for_each_slave(bond, slave, i) {22572257- struct net_device *slave_dev = slave->dev;22582258- int link_state;22592259- u16 old_speed = slave->speed;22602260- u8 old_duplex = slave->duplex;22332233+ slave->new_link = BOND_LINK_NOCHANGE;2261223422622262- link_state = bond_check_dev_link(bond, slave_dev, 0);22352235+ link_state = bond_check_dev_link(bond, slave->dev, 0);2263223622642237 switch (slave->link) {22652265- case BOND_LINK_UP: /* the link was up */22662266- if (link_state == BMSR_LSTATUS) {22672267- if (!oldcurrent) {22682268- if (!have_locks)22692269- return 1;22702270- do_failover = 1;22712271- }22722272- break;22732273- } else { /* link going down */22742274- slave->link = BOND_LINK_FAIL;22752275- slave->delay = bond->params.downdelay;22382238+ case BOND_LINK_UP:22392239+ if (link_state)22402240+ continue;2276224122772277- if (slave->link_failure_count < UINT_MAX) {22782278- slave->link_failure_count++;22792279- }22802280-22812281- if (bond->params.downdelay) {22822282- printk(KERN_INFO DRV_NAME22832283- ": %s: link status down for %s "22842284- "interface %s, disabling it in "22852285- "%d ms.\n",22862286- bond->dev->name,22872287- IS_UP(slave_dev)22882288- ? ((bond->params.mode == BOND_MODE_ACTIVEBACKUP)22892289- ? ((slave == oldcurrent)22902290- ? "active " : "backup ")22912291- : "")22922292- : "idle ",22932293- slave_dev->name,22942294- bond->params.downdelay * bond->params.miimon);22952295- }22422242+ slave->link = BOND_LINK_FAIL;22432243+ slave->delay = bond->params.downdelay;22442244+ if (slave->delay) {22452245+ printk(KERN_INFO DRV_NAME22462246+ ": %s: link status down for %s"22472247+ "interface %s, disabling it in %d ms.\n",22482248+ bond->dev->name,22492249+ (bond->params.mode ==22502250+ BOND_MODE_ACTIVEBACKUP) ?22512251+ ((slave->state == BOND_STATE_ACTIVE) ?22522252+ "active " : "backup ") : "",22532253+ slave->dev->name,22542254+ bond->params.downdelay * bond->params.miimon);22962255 }22972297- /* no break ! fall through the BOND_LINK_FAIL test to22982298- ensure proper action to be taken22992299- */23002300- case BOND_LINK_FAIL: /* the link has just gone down */23012301- if (link_state != BMSR_LSTATUS) {23022302- /* link stays down */23032303- if (slave->delay <= 0) {23042304- if (!have_locks)23052305- return 1;23062306-23072307- /* link down for too long time */23082308- slave->link = BOND_LINK_DOWN;23092309-23102310- /* in active/backup mode, we must23112311- * completely disable this interface23122312- */23132313- if ((bond->params.mode == BOND_MODE_ACTIVEBACKUP) ||23142314- (bond->params.mode == BOND_MODE_8023AD)) {23152315- bond_set_slave_inactive_flags(slave);23162316- }23172317-23182318- printk(KERN_INFO DRV_NAME23192319- ": %s: link status definitely "23202320- "down for interface %s, "23212321- "disabling it\n",23222322- bond->dev->name,23232323- slave_dev->name);23242324-23252325- /* notify ad that the link status has changed */23262326- if (bond->params.mode == BOND_MODE_8023AD) {23272327- bond_3ad_handle_link_change(slave, BOND_LINK_DOWN);23282328- }23292329-23302330- if ((bond->params.mode == BOND_MODE_TLB) ||23312331- (bond->params.mode == BOND_MODE_ALB)) {23322332- bond_alb_handle_link_change(bond, slave, BOND_LINK_DOWN);23332333- }23342334-23352335- if (slave == oldcurrent) {23362336- do_failover = 1;23372337- }23382338- } else {23392339- slave->delay--;23402340- }23412341- } else {23422342- /* link up again */23432343- slave->link = BOND_LINK_UP;22562256+ /*FALLTHRU*/22572257+ case BOND_LINK_FAIL:22582258+ if (link_state) {22592259+ /*22602260+ * recovered before downdelay expired22612261+ */22622262+ slave->link = BOND_LINK_UP;23442263 slave->jiffies = jiffies;23452264 printk(KERN_INFO DRV_NAME23462265 ": %s: link status up again after %d "23472266 "ms for interface %s.\n",23482267 bond->dev->name,23492349- (bond->params.downdelay - slave->delay) * bond->params.miimon,23502350- slave_dev->name);22682268+ (bond->params.downdelay - slave->delay) *22692269+ bond->params.miimon,22702270+ slave->dev->name);22712271+ continue;23512272 }22732273+22742274+ if (slave->delay <= 0) {22752275+ slave->new_link = BOND_LINK_DOWN;22762276+ commit++;22772277+ continue;22782278+ }22792279+22802280+ slave->delay--;23522281 break;23532353- case BOND_LINK_DOWN: /* the link was down */23542354- if (link_state != BMSR_LSTATUS) {23552355- /* the link stays down, nothing more to do */23562356- break;23572357- } else { /* link going up */23582358- slave->link = BOND_LINK_BACK;23592359- slave->delay = bond->params.updelay;2360228223612361- if (bond->params.updelay) {23622362- /* if updelay == 0, no need to23632363- advertise about a 0 ms delay */23642364- printk(KERN_INFO DRV_NAME23652365- ": %s: link status up for "23662366- "interface %s, enabling it "23672367- "in %d ms.\n",23682368- bond->dev->name,23692369- slave_dev->name,23702370- bond->params.updelay * bond->params.miimon);23712371- }22832283+ case BOND_LINK_DOWN:22842284+ if (!link_state)22852285+ continue;22862286+22872287+ slave->link = BOND_LINK_BACK;22882288+ slave->delay = bond->params.updelay;22892289+22902290+ if (slave->delay) {22912291+ printk(KERN_INFO DRV_NAME22922292+ ": %s: link status up for "22932293+ "interface %s, enabling it in %d ms.\n",22942294+ bond->dev->name, slave->dev->name,22952295+ bond->params.updelay *22962296+ bond->params.miimon);23722297 }23732373- /* no break ! fall through the BOND_LINK_BACK state in23742374- case there's something to do.23752375- */23762376- case BOND_LINK_BACK: /* the link has just come back */23772377- if (link_state != BMSR_LSTATUS) {23782378- /* link down again */23792379- slave->link = BOND_LINK_DOWN;23802380-22982298+ /*FALLTHRU*/22992299+ case BOND_LINK_BACK:23002300+ if (!link_state) {23012301+ slave->link = BOND_LINK_DOWN;23812302 printk(KERN_INFO DRV_NAME23822303 ": %s: link status down again after %d "23832304 "ms for interface %s.\n",23842305 bond->dev->name,23852385- (bond->params.updelay - slave->delay) * bond->params.miimon,23862386- slave_dev->name);23872387- } else {23882388- /* link stays up */23892389- if (slave->delay == 0) {23902390- if (!have_locks)23912391- return 1;23062306+ (bond->params.updelay - slave->delay) *23072307+ bond->params.miimon,23082308+ slave->dev->name);2392230923932393- /* now the link has been up for long time enough */23942394- slave->link = BOND_LINK_UP;23952395- slave->jiffies = jiffies;23962396-23972397- if (bond->params.mode == BOND_MODE_8023AD) {23982398- /* prevent it from being the active one */23992399- slave->state = BOND_STATE_BACKUP;24002400- } else if (bond->params.mode != BOND_MODE_ACTIVEBACKUP) {24012401- /* make it immediately active */24022402- slave->state = BOND_STATE_ACTIVE;24032403- } else if (slave != bond->primary_slave) {24042404- /* prevent it from being the active one */24052405- slave->state = BOND_STATE_BACKUP;24062406- }24072407-24082408- printk(KERN_INFO DRV_NAME24092409- ": %s: link status definitely "24102410- "up for interface %s.\n",24112411- bond->dev->name,24122412- slave_dev->name);24132413-24142414- /* notify ad that the link status has changed */24152415- if (bond->params.mode == BOND_MODE_8023AD) {24162416- bond_3ad_handle_link_change(slave, BOND_LINK_UP);24172417- }24182418-24192419- if ((bond->params.mode == BOND_MODE_TLB) ||24202420- (bond->params.mode == BOND_MODE_ALB)) {24212421- bond_alb_handle_link_change(bond, slave, BOND_LINK_UP);24222422- }24232423-24242424- if ((!oldcurrent) ||24252425- (slave == bond->primary_slave)) {24262426- do_failover = 1;24272427- }24282428- } else {24292429- slave->delay--;24302430- }23102310+ continue;24312311 }23122312+23132313+ if (slave->delay <= 0) {23142314+ slave->new_link = BOND_LINK_UP;23152315+ commit++;23162316+ continue;23172317+ }23182318+23192319+ slave->delay--;24322320 break;23212321+ }23222322+ }23232323+23242324+ return commit;23252325+}23262326+23272327+static void bond_miimon_commit(struct bonding *bond)23282328+{23292329+ struct slave *slave;23302330+ int i;23312331+23322332+ bond_for_each_slave(bond, slave, i) {23332333+ switch (slave->new_link) {23342334+ case BOND_LINK_NOCHANGE:23352335+ continue;23362336+23372337+ case BOND_LINK_UP:23382338+ slave->link = BOND_LINK_UP;23392339+ slave->jiffies = jiffies;23402340+23412341+ if (bond->params.mode == BOND_MODE_8023AD) {23422342+ /* prevent it from being the active one */23432343+ slave->state = BOND_STATE_BACKUP;23442344+ } else if (bond->params.mode != BOND_MODE_ACTIVEBACKUP) {23452345+ /* make it immediately active */23462346+ slave->state = BOND_STATE_ACTIVE;23472347+ } else if (slave != bond->primary_slave) {23482348+ /* prevent it from being the active one */23492349+ slave->state = BOND_STATE_BACKUP;23502350+ }23512351+23522352+ printk(KERN_INFO DRV_NAME23532353+ ": %s: link status definitely "23542354+ "up for interface %s.\n",23552355+ bond->dev->name, slave->dev->name);23562356+23572357+ /* notify ad that the link status has changed */23582358+ if (bond->params.mode == BOND_MODE_8023AD)23592359+ bond_3ad_handle_link_change(slave, BOND_LINK_UP);23602360+23612361+ if ((bond->params.mode == BOND_MODE_TLB) ||23622362+ (bond->params.mode == BOND_MODE_ALB))23632363+ bond_alb_handle_link_change(bond, slave,23642364+ BOND_LINK_UP);23652365+23662366+ if (!bond->curr_active_slave ||23672367+ (slave == bond->primary_slave))23682368+ goto do_failover;23692369+23702370+ continue;23712371+23722372+ case BOND_LINK_DOWN:23732373+ slave->link = BOND_LINK_DOWN;23742374+23752375+ if (bond->params.mode == BOND_MODE_ACTIVEBACKUP ||23762376+ bond->params.mode == BOND_MODE_8023AD)23772377+ bond_set_slave_inactive_flags(slave);23782378+23792379+ printk(KERN_INFO DRV_NAME23802380+ ": %s: link status definitely down for "23812381+ "interface %s, disabling it\n",23822382+ bond->dev->name, slave->dev->name);23832383+23842384+ if (bond->params.mode == BOND_MODE_8023AD)23852385+ bond_3ad_handle_link_change(slave,23862386+ BOND_LINK_DOWN);23872387+23882388+ if (bond->params.mode == BOND_MODE_TLB ||23892389+ bond->params.mode == BOND_MODE_ALB)23902390+ bond_alb_handle_link_change(bond, slave,23912391+ BOND_LINK_DOWN);23922392+23932393+ if (slave == bond->curr_active_slave)23942394+ goto do_failover;23952395+23962396+ continue;23972397+24332398 default:24342434- /* Should not happen */24352399 printk(KERN_ERR DRV_NAME24362436- ": %s: Error: %s Illegal value (link=%d)\n",24372437- bond->dev->name,24382438- slave->dev->name,24392439- slave->link);24402440- goto out;24412441- } /* end of switch (slave->link) */24002400+ ": %s: invalid new link %d on slave %s\n",24012401+ bond->dev->name, slave->new_link,24022402+ slave->dev->name);24032403+ slave->new_link = BOND_LINK_NOCHANGE;2442240424432443- bond_update_speed_duplex(slave);24442444-24452445- if (bond->params.mode == BOND_MODE_8023AD) {24462446- if (old_speed != slave->speed) {24472447- bond_3ad_adapter_speed_changed(slave);24482448- }24492449-24502450- if (old_duplex != slave->duplex) {24512451- bond_3ad_adapter_duplex_changed(slave);24522452- }24052405+ continue;24532406 }2454240724552455- } /* end of for */24562456-24572457- if (do_failover) {24082408+do_failover:24582409 ASSERT_RTNL();24592459-24602410 write_lock_bh(&bond->curr_slave_lock);24612461-24622411 bond_select_active_slave(bond);24632463-24642412 write_unlock_bh(&bond->curr_slave_lock);24132413+ }2465241424662466- } else24672467- bond_set_carrier(bond);24682468-24692469-out:24702470- return 0;24152415+ bond_set_carrier(bond);24712416}2472241724732418/*24742419 * bond_mii_monitor24752420 *24762421 * Really a wrapper that splits the mii monitor into two phases: an24772477- * inspection, then (if inspection indicates something needs to be24782478- * done) an acquisition of appropriate locks followed by another pass24792479- * to implement whatever link state changes are indicated.24222422+ * inspection, then (if inspection indicates something needs to be done)24232423+ * an acquisition of appropriate locks followed by a commit phase to24242424+ * implement whatever link state changes are indicated.24802425 */24812426void bond_mii_monitor(struct work_struct *work)24822427{24832428 struct bonding *bond = container_of(work, struct bonding,24842429 mii_work.work);24852485- unsigned long delay;2486243024872431 read_lock(&bond->lock);24882488- if (bond->kill_timers) {24892489- read_unlock(&bond->lock);24902490- return;24912491- }24322432+ if (bond->kill_timers)24332433+ goto out;24342434+24352435+ if (bond->slave_cnt == 0)24362436+ goto re_arm;2492243724932438 if (bond->send_grat_arp) {24942439 read_lock(&bond->curr_slave_lock);···24412496 read_unlock(&bond->curr_slave_lock);24422497 }2443249824442444- if (__bond_mii_monitor(bond, 0)) {24992499+ if (bond_miimon_inspect(bond)) {24452500 read_unlock(&bond->lock);24462501 rtnl_lock();24472502 read_lock(&bond->lock);24482448- __bond_mii_monitor(bond, 1);25032503+25042504+ bond_miimon_commit(bond);25052505+24492506 read_unlock(&bond->lock);24502507 rtnl_unlock(); /* might sleep, hold no other locks */24512508 read_lock(&bond->lock);24522509 }2453251024542454- delay = msecs_to_jiffies(bond->params.miimon);25112511+re_arm:25122512+ if (bond->params.miimon)25132513+ queue_delayed_work(bond->wq, &bond->mii_work,25142514+ msecs_to_jiffies(bond->params.miimon));25152515+out:24552516 read_unlock(&bond->lock);24562456- queue_delayed_work(bond->wq, &bond->mii_work, delay);24572517}2458251824592519static __be32 bond_glean_dev_ip(struct net_device *dev)
-3
drivers/net/bonding/bond_sysfs.c
···350350 if (dev) {351351 printk(KERN_INFO DRV_NAME ": %s: Removing slave %s\n",352352 bond->dev->name, dev->name);353353- if (bond->setup_by_slave)354354- res = bond_release_and_destroy(bond->dev, dev);355355- else356353 res = bond_release(bond->dev, dev);357354 if (res) {358355 ret = res;
-7
drivers/net/de620.c
···488488{489489 if (dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC))490490 { /* Enable promiscuous mode */491491- /*492492- * We must make the kernel realise we had to move493493- * into promisc mode or we start all out war on494494- * the cable. - AC495495- */496496- dev->flags|=IFF_PROMISC;497497-498491 de620_set_register(dev, W_TCR, (TCR_DEF & ~RXPBM) | RXALL);499492 }500493 else
+5
drivers/net/dm9000.c
···13741374 for (i = 0; i < 6; i += 2)13751375 dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i);1376137613771377+ if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {13781378+ mac_src = "platform data";13791379+ memcpy(ndev->dev_addr, pdata->dev_addr, 6);13801380+ }13811381+13771382 if (!is_valid_ether_addr(ndev->dev_addr)) {13781383 /* try reading from mac */13791384
+14-17
drivers/net/e1000e/e1000.h
···41414242struct e1000_info;43434444-#define ndev_printk(level, netdev, format, arg...) \4545- printk(level "%s: " format, (netdev)->name, ## arg)4444+#define e_printk(level, adapter, format, arg...) \4545+ printk(level "%s: %s: " format, pci_name(adapter->pdev), \4646+ adapter->netdev->name, ## arg)46474748#ifdef DEBUG4848-#define ndev_dbg(netdev, format, arg...) \4949- ndev_printk(KERN_DEBUG , netdev, format, ## arg)4949+#define e_dbg(format, arg...) \5050+ e_printk(KERN_DEBUG , adapter, format, ## arg)5051#else5151-#define ndev_dbg(netdev, format, arg...) do { (void)(netdev); } while (0)5252+#define e_dbg(format, arg...) do { (void)(adapter); } while (0)5253#endif53545454-#define ndev_err(netdev, format, arg...) \5555- ndev_printk(KERN_ERR , netdev, format, ## arg)5656-#define ndev_info(netdev, format, arg...) \5757- ndev_printk(KERN_INFO , netdev, format, ## arg)5858-#define ndev_warn(netdev, format, arg...) \5959- ndev_printk(KERN_WARNING , netdev, format, ## arg)6060-#define ndev_notice(netdev, format, arg...) \6161- ndev_printk(KERN_NOTICE , netdev, format, ## arg)5555+#define e_err(format, arg...) \5656+ e_printk(KERN_ERR, adapter, format, ## arg)5757+#define e_info(format, arg...) \5858+ e_printk(KERN_INFO, adapter, format, ## arg)5959+#define e_warn(format, arg...) \6060+ e_printk(KERN_WARNING, adapter, format, ## arg)6161+#define e_notice(format, arg...) \6262+ e_printk(KERN_NOTICE, adapter, format, ## arg)626363646465/* Tx/Rx descriptor defines */···284283 unsigned long led_status;285284286285 unsigned int flags;287287-288288- /* for ioport free */289289- int bars;290290- int need_ioport;291286};292287293288struct e1000_info {
+18-26
drivers/net/e1000e/ethtool.c
···189189 /* Fiber NICs only allow 1000 gbps Full duplex */190190 if ((adapter->hw.phy.media_type == e1000_media_type_fiber) &&191191 spddplx != (SPEED_1000 + DUPLEX_FULL)) {192192- ndev_err(adapter->netdev, "Unsupported Speed/Duplex "193193- "configuration\n");192192+ e_err("Unsupported Speed/Duplex configuration\n");194193 return -EINVAL;195194 }196195···212213 break;213214 case SPEED_1000 + DUPLEX_HALF: /* not supported */214215 default:215215- ndev_err(adapter->netdev, "Unsupported Speed/Duplex "216216- "configuration\n");216216+ e_err("Unsupported Speed/Duplex configuration\n");217217 return -EINVAL;218218 }219219 return 0;···229231 * cannot be changed230232 */231233 if (e1000_check_reset_block(hw)) {232232- ndev_err(netdev, "Cannot change link "233233- "characteristics when SoL/IDER is active.\n");234234+ e_err("Cannot change link characteristics when SoL/IDER is "235235+ "active.\n");234236 return -EINVAL;235237 }236238···378380 netdev->features &= ~NETIF_F_TSO6;379381 }380382381381- ndev_info(netdev, "TSO is %s\n",382382- data ? "Enabled" : "Disabled");383383+ e_info("TSO is %s\n", data ? "Enabled" : "Disabled");383384 adapter->flags |= FLAG_TSO_FORCE;384385 return 0;385386}···719722 (test[pat] & write));720723 val = E1000_READ_REG_ARRAY(&adapter->hw, reg, offset);721724 if (val != (test[pat] & write & mask)) {722722- ndev_err(adapter->netdev, "pattern test reg %04X "723723- "failed: got 0x%08X expected 0x%08X\n",724724- reg + offset,725725- val, (test[pat] & write & mask));725725+ e_err("pattern test reg %04X failed: got 0x%08X "726726+ "expected 0x%08X\n", reg + offset, val,727727+ (test[pat] & write & mask));726728 *data = reg;727729 return 1;728730 }···736740 __ew32(&adapter->hw, reg, write & mask);737741 val = __er32(&adapter->hw, reg);738742 if ((write & mask) != (val & mask)) {739739- ndev_err(adapter->netdev, "set/check reg %04X test failed: "740740- "got 0x%08X expected 0x%08X\n", reg, (val & mask),741741- (write & mask));743743+ e_err("set/check reg %04X test failed: got 0x%08X "744744+ "expected 0x%08X\n", reg, (val & mask), (write & mask));742745 *data = reg;743746 return 1;744747 }···761766{762767 struct e1000_hw *hw = &adapter->hw;763768 struct e1000_mac_info *mac = &adapter->hw.mac;764764- struct net_device *netdev = adapter->netdev;765769 u32 value;766770 u32 before;767771 u32 after;···793799 ew32(STATUS, toggle);794800 after = er32(STATUS) & toggle;795801 if (value != after) {796796- ndev_err(netdev, "failed STATUS register test got: "797797- "0x%08X expected: 0x%08X\n", after, value);802802+ e_err("failed STATUS register test got: 0x%08X expected: "803803+ "0x%08X\n", after, value);798804 *data = 1;799805 return 1;800806 }···897903 *data = 1;898904 return -1;899905 }900900- ndev_info(netdev, "testing %s interrupt\n",901901- (shared_int ? "shared" : "unshared"));906906+ e_info("testing %s interrupt\n", (shared_int ? "shared" : "unshared"));902907903908 /* Disable all the interrupts */904909 ew32(IMC, 0xFFFFFFFF);···15191526 * sessions are active15201527 */15211528 if (e1000_check_reset_block(&adapter->hw)) {15221522- ndev_err(adapter->netdev, "Cannot do PHY loopback test "15231523- "when SoL/IDER is active.\n");15291529+ e_err("Cannot do PHY loopback test when SoL/IDER is active.\n");15241530 *data = 0;15251531 goto out;15261532 }···16041612 forced_speed_duplex = adapter->hw.mac.forced_speed_duplex;16051613 autoneg = adapter->hw.mac.autoneg;1606161416071607- ndev_info(netdev, "offline testing starting\n");16151615+ e_info("offline testing starting\n");1608161616091617 /*16101618 * Link test performed before hardware reset so autoneg doesn't···16501658 if (if_running)16511659 dev_open(netdev);16521660 } else {16531653- ndev_info(netdev, "online testing starting\n");16611661+ e_info("online testing starting\n");16541662 /* Online tests */16551663 if (e1000_link_test(adapter, &data[4]))16561664 eth_test->flags |= ETH_TEST_FL_FAILED;···16861694 wol->supported &= ~WAKE_UCAST;1687169516881696 if (adapter->wol & E1000_WUFC_EX)16891689- ndev_err(netdev, "Interface does not support "16901690- "directed (unicast) frame wake-up packets\n");16971697+ e_err("Interface does not support directed (unicast) "16981698+ "frame wake-up packets\n");16911699 }1692170016931701 if (adapter->wol & E1000_WUFC_EX)
+110-136
drivers/net/e1000e/netdev.c
···484484 * packet, also make sure the frame isn't just CRC only */485485 if (!(status & E1000_RXD_STAT_EOP) || (length <= 4)) {486486 /* All receives must fit into a single buffer */487487- ndev_dbg(netdev, "%s: Receive packet consumed "488488- "multiple buffers\n", netdev->name);487487+ e_dbg("%s: Receive packet consumed multiple buffers\n",488488+ netdev->name);489489 /* recycle */490490 buffer_info->skb = skb;491491 goto next_desc;···576576 unsigned int i = tx_ring->next_to_clean;577577 unsigned int eop = tx_ring->buffer_info[i].next_to_watch;578578 struct e1000_tx_desc *eop_desc = E1000_TX_DESC(*tx_ring, eop);579579- struct net_device *netdev = adapter->netdev;580579581580 /* detected Tx unit hang */582582- ndev_err(netdev,583583- "Detected Tx Unit Hang:\n"584584- " TDH <%x>\n"585585- " TDT <%x>\n"586586- " next_to_use <%x>\n"587587- " next_to_clean <%x>\n"588588- "buffer_info[next_to_clean]:\n"589589- " time_stamp <%lx>\n"590590- " next_to_watch <%x>\n"591591- " jiffies <%lx>\n"592592- " next_to_watch.status <%x>\n",593593- readl(adapter->hw.hw_addr + tx_ring->head),594594- readl(adapter->hw.hw_addr + tx_ring->tail),595595- tx_ring->next_to_use,596596- tx_ring->next_to_clean,597597- tx_ring->buffer_info[eop].time_stamp,598598- eop,599599- jiffies,600600- eop_desc->upper.fields.status);581581+ e_err("Detected Tx Unit Hang:\n"582582+ " TDH <%x>\n"583583+ " TDT <%x>\n"584584+ " next_to_use <%x>\n"585585+ " next_to_clean <%x>\n"586586+ "buffer_info[next_to_clean]:\n"587587+ " time_stamp <%lx>\n"588588+ " next_to_watch <%x>\n"589589+ " jiffies <%lx>\n"590590+ " next_to_watch.status <%x>\n",591591+ readl(adapter->hw.hw_addr + tx_ring->head),592592+ readl(adapter->hw.hw_addr + tx_ring->tail),593593+ tx_ring->next_to_use,594594+ tx_ring->next_to_clean,595595+ tx_ring->buffer_info[eop].time_stamp,596596+ eop,597597+ jiffies,598598+ eop_desc->upper.fields.status);601599}602600603601/**···745747 buffer_info->dma = 0;746748747749 if (!(staterr & E1000_RXD_STAT_EOP)) {748748- ndev_dbg(netdev, "%s: Packet Split buffers didn't pick "749749- "up the full packet\n", netdev->name);750750+ e_dbg("%s: Packet Split buffers didn't pick up the "751751+ "full packet\n", netdev->name);750752 dev_kfree_skb_irq(skb);751753 goto next_desc;752754 }···759761 length = le16_to_cpu(rx_desc->wb.middle.length0);760762761763 if (!length) {762762- ndev_dbg(netdev, "%s: Last part of the packet spanning"763763- " multiple descriptors\n", netdev->name);764764+ e_dbg("%s: Last part of the packet spanning multiple "765765+ "descriptors\n", netdev->name);764766 dev_kfree_skb_irq(skb);765767 goto next_desc;766768 }···1009101110101012 /* eth type trans needs skb->data to point to something */10111013 if (!pskb_may_pull(skb, ETH_HLEN)) {10121012- ndev_err(netdev, "pskb_may_pull failed.\n");10141014+ e_err("pskb_may_pull failed.\n");10131015 dev_kfree_skb(skb);10141016 goto next_desc;10151017 }···12491251 err = request_irq(adapter->pdev->irq, handler, irq_flags, netdev->name,12501252 netdev);12511253 if (err) {12521252- ndev_err(netdev,12531253- "Unable to allocate %s interrupt (return: %d)\n",12541254- adapter->flags & FLAG_MSI_ENABLED ? "MSI":"INTx",12551255- err);12541254+ e_err("Unable to allocate %s interrupt (return: %d)\n",12551255+ adapter->flags & FLAG_MSI_ENABLED ? "MSI":"INTx", err);12561256 if (adapter->flags & FLAG_MSI_ENABLED)12571257 pci_disable_msi(adapter->pdev);12581258 }···13911395 return 0;13921396err:13931397 vfree(tx_ring->buffer_info);13941394- ndev_err(adapter->netdev,13951395- "Unable to allocate memory for the transmit descriptor ring\n");13981398+ e_err("Unable to allocate memory for the transmit descriptor ring\n");13961399 return err;13971400}13981401···14451450 }14461451err:14471452 vfree(rx_ring->buffer_info);14481448- ndev_err(adapter->netdev,14491449- "Unable to allocate memory for the transmit descriptor ring\n");14531453+ e_err("Unable to allocate memory for the transmit descriptor ring\n");14501454 return err;14511455}14521456···24442450 * For parts with AMT enabled, let the firmware know24452451 * that the network interface is in control24462452 */24472447- if ((adapter->flags & FLAG_HAS_AMT) && e1000e_check_mng_mode(hw))24532453+ if (adapter->flags & FLAG_HAS_AMT)24482454 e1000_get_hw_control(adapter);2449245524502456 ew32(WUC, 0);2451245724522458 if (mac->ops.init_hw(hw))24532453- ndev_err(adapter->netdev, "Hardware Error\n");24592459+ e_err("Hardware Error\n");2454246024552461 e1000_update_mng_vlan(adapter);24562462···25852591 return 0;2586259225872593err:25882588- ndev_err(netdev, "Unable to allocate memory for queues\n");25942594+ e_err("Unable to allocate memory for queues\n");25892595 kfree(adapter->rx_ring);25902596 kfree(adapter->tx_ring);25912597 return -ENOMEM;···26342640 * If AMT is enabled, let the firmware know that the network26352641 * interface is now open26362642 */26372637- if ((adapter->flags & FLAG_HAS_AMT) &&26382638- e1000e_check_mng_mode(&adapter->hw))26432643+ if (adapter->flags & FLAG_HAS_AMT)26392644 e1000_get_hw_control(adapter);2640264526412646 /*···27122719 * If AMT is enabled, let the firmware know that the network27132720 * interface is now closed27142721 */27152715- if ((adapter->flags & FLAG_HAS_AMT) &&27162716- e1000e_check_mng_mode(&adapter->hw))27222722+ if (adapter->flags & FLAG_HAS_AMT)27172723 e1000_release_hw_control(adapter);2718272427192725 return 0;···29092917 ret_val |= e1e_rphy(hw, PHY_1000T_STATUS, &phy->stat1000);29102918 ret_val |= e1e_rphy(hw, PHY_EXT_STATUS, &phy->estatus);29112919 if (ret_val)29122912- ndev_warn(adapter->netdev,29132913- "Error reading PHY register\n");29202920+ e_warn("Error reading PHY register\n");29142921 } else {29152922 /*29162923 * Do not read PHY registers if link is not up···29342943static void e1000_print_link_info(struct e1000_adapter *adapter)29352944{29362945 struct e1000_hw *hw = &adapter->hw;29372937- struct net_device *netdev = adapter->netdev;29382946 u32 ctrl = er32(CTRL);2939294729402940- ndev_info(netdev,29412941- "Link is Up %d Mbps %s, Flow Control: %s\n",29422942- adapter->link_speed,29432943- (adapter->link_duplex == FULL_DUPLEX) ?29442944- "Full Duplex" : "Half Duplex",29452945- ((ctrl & E1000_CTRL_TFCE) && (ctrl & E1000_CTRL_RFCE)) ?29462946- "RX/TX" :29472947- ((ctrl & E1000_CTRL_RFCE) ? "RX" :29482948- ((ctrl & E1000_CTRL_TFCE) ? "TX" : "None" )));29482948+ e_info("Link is Up %d Mbps %s, Flow Control: %s\n",29492949+ adapter->link_speed,29502950+ (adapter->link_duplex == FULL_DUPLEX) ?29512951+ "Full Duplex" : "Half Duplex",29522952+ ((ctrl & E1000_CTRL_TFCE) && (ctrl & E1000_CTRL_RFCE)) ?29532953+ "RX/TX" :29542954+ ((ctrl & E1000_CTRL_RFCE) ? "RX" :29552955+ ((ctrl & E1000_CTRL_TFCE) ? "TX" : "None" )));29492956}2950295729512958static bool e1000_has_link(struct e1000_adapter *adapter)···29832994 if ((ret_val == E1000_ERR_PHY) && (hw->phy.type == e1000_phy_igp_3) &&29842995 (er32(CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) {29852996 /* See e1000_kmrn_lock_loss_workaround_ich8lan() */29862986- ndev_info(adapter->netdev,29872987- "Gigabit has been disabled, downgrading speed\n");29972997+ e_info("Gigabit has been disabled, downgrading speed\n");29882998 }2989299929903000 return link_active;···30843096 switch (adapter->link_speed) {30853097 case SPEED_10:30863098 case SPEED_100:30873087- ndev_info(netdev,30883088- "10/100 speed: disabling TSO\n");30993099+ e_info("10/100 speed: disabling TSO\n");30893100 netdev->features &= ~NETIF_F_TSO;30903101 netdev->features &= ~NETIF_F_TSO6;30913102 break;···31173130 if (netif_carrier_ok(netdev)) {31183131 adapter->link_speed = 0;31193132 adapter->link_duplex = 0;31203120- ndev_info(netdev, "Link is Down\n");31333133+ e_info("Link is Down\n");31213134 netif_carrier_off(netdev);31223135 netif_tx_stop_all_queues(netdev);31233136 if (!test_bit(__E1000_DOWN, &adapter->state))···3591360435923605 pull_size = min((unsigned int)4, skb->data_len);35933606 if (!__pskb_pull_tail(skb, pull_size)) {35943594- ndev_err(netdev,35953595- "__pskb_pull_tail failed.\n");36073607+ e_err("__pskb_pull_tail failed.\n");35963608 dev_kfree_skb_any(skb);35973609 return NETDEV_TX_OK;35983610 }···3723373737243738 if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||37253739 (max_frame > MAX_JUMBO_FRAME_SIZE)) {37263726- ndev_err(netdev, "Invalid MTU setting\n");37403740+ e_err("Invalid MTU setting\n");37273741 return -EINVAL;37283742 }3729374337303744 /* Jumbo frame size limits */37313745 if (max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) {37323746 if (!(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) {37333733- ndev_err(netdev, "Jumbo Frames not supported.\n");37473747+ e_err("Jumbo Frames not supported.\n");37343748 return -EINVAL;37353749 }37363750 if (adapter->hw.phy.type == e1000_phy_ife) {37373737- ndev_err(netdev, "Jumbo Frames not supported.\n");37513751+ e_err("Jumbo Frames not supported.\n");37383752 return -EINVAL;37393753 }37403754 }3741375537423756#define MAX_STD_JUMBO_FRAME_SIZE 923437433757 if (max_frame > MAX_STD_JUMBO_FRAME_SIZE) {37443744- ndev_err(netdev, "MTU > 9216 not supported.\n");37583758+ e_err("MTU > 9216 not supported.\n");37453759 return -EINVAL;37463760 }37473761···37783792 adapter->rx_buffer_len = ETH_FRAME_LEN + VLAN_HLEN37793793 + ETH_FCS_LEN;3780379437813781- ndev_info(netdev, "changing MTU from %d to %d\n",37823782- netdev->mtu, new_mtu);37953795+ e_info("changing MTU from %d to %d\n", netdev->mtu, new_mtu);37833796 netdev->mtu = new_mtu;3784379737853798 if (netif_running(netdev))···39914006 pci_restore_state(pdev);39924007 e1000e_disable_l1aspm(pdev);3993400839943994- if (adapter->need_ioport)39953995- err = pci_enable_device(pdev);39963996- else39973997- err = pci_enable_device_mem(pdev);40094009+ err = pci_enable_device_mem(pdev);39984010 if (err) {39994011 dev_err(&pdev->dev,40004012 "Cannot enable PCI device from suspend\n");···40254043 * is up. For all other cases, let the f/w know that the h/w is now40264044 * under the control of the driver.40274045 */40284028- if (!(adapter->flags & FLAG_HAS_AMT) || !e1000e_check_mng_mode(&adapter->hw))40464046+ if (!(adapter->flags & FLAG_HAS_AMT))40294047 e1000_get_hw_control(adapter);4030404840314049 return 0;···40934111 int err;4094411240954113 e1000e_disable_l1aspm(pdev);40964096- if (adapter->need_ioport)40974097- err = pci_enable_device(pdev);40984098- else40994099- err = pci_enable_device_mem(pdev);41144114+ err = pci_enable_device_mem(pdev);41004115 if (err) {41014116 dev_err(&pdev->dev,41024117 "Cannot re-enable PCI device after reset.\n");···41414162 * is up. For all other cases, let the f/w know that the h/w is now41424163 * under the control of the driver.41434164 */41444144- if (!(adapter->flags & FLAG_HAS_AMT) ||41454145- !e1000e_check_mng_mode(&adapter->hw))41654165+ if (!(adapter->flags & FLAG_HAS_AMT))41464166 e1000_get_hw_control(adapter);4147416741484168}···41534175 u32 pba_num;4154417641554177 /* print bus type/speed/width info */41564156- ndev_info(netdev, "(PCI Express:2.5GB/s:%s) "41574157- "%02x:%02x:%02x:%02x:%02x:%02x\n",41584158- /* bus width */41594159- ((hw->bus.width == e1000_bus_width_pcie_x4) ? "Width x4" :41604160- "Width x1"),41614161- /* MAC address */41624162- netdev->dev_addr[0], netdev->dev_addr[1],41634163- netdev->dev_addr[2], netdev->dev_addr[3],41644164- netdev->dev_addr[4], netdev->dev_addr[5]);41654165- ndev_info(netdev, "Intel(R) PRO/%s Network Connection\n",41664166- (hw->phy.type == e1000_phy_ife)41674167- ? "10/100" : "1000");41784178+ e_info("(PCI Express:2.5GB/s:%s) %02x:%02x:%02x:%02x:%02x:%02x\n",41794179+ /* bus width */41804180+ ((hw->bus.width == e1000_bus_width_pcie_x4) ? "Width x4" :41814181+ "Width x1"),41824182+ /* MAC address */41834183+ netdev->dev_addr[0], netdev->dev_addr[1],41844184+ netdev->dev_addr[2], netdev->dev_addr[3],41854185+ netdev->dev_addr[4], netdev->dev_addr[5]);41864186+ e_info("Intel(R) PRO/%s Network Connection\n",41874187+ (hw->phy.type == e1000_phy_ife) ? "10/100" : "1000");41684188 e1000e_read_pba_num(hw, &pba_num);41694169- ndev_info(netdev, "MAC: %d, PHY: %d, PBA No: %06x-%03x\n",41704170- hw->mac.type, hw->phy.type,41714171- (pba_num >> 8), (pba_num & 0xff));41894189+ e_info("MAC: %d, PHY: %d, PBA No: %06x-%03x\n",41904190+ hw->mac.type, hw->phy.type, (pba_num >> 8), (pba_num & 0xff));41724191}4173419241744174-/**41754175- * e1000e_is_need_ioport - determine if an adapter needs ioport resources or not41764176- * @pdev: PCI device information struct41774177- *41784178- * Returns true if an adapters needs ioport resources41794179- **/41804180-static int e1000e_is_need_ioport(struct pci_dev *pdev)41934193+static void e1000_eeprom_checks(struct e1000_adapter *adapter)41814194{41824182- switch (pdev->device) {41834183- /* Currently there are no adapters that need ioport resources */41844184- default:41854185- return false;41954195+ struct e1000_hw *hw = &adapter->hw;41964196+ int ret_val;41974197+ u16 buf = 0;41984198+41994199+ if (hw->mac.type != e1000_82573)42004200+ return;42014201+42024202+ ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &buf);42034203+ if (!(le16_to_cpu(buf) & (1 << 0))) {42044204+ /* Deep Smart Power Down (DSPD) */42054205+ e_warn("Warning: detected DSPD enabled in EEPROM\n");42064206+ }42074207+42084208+ ret_val = e1000_read_nvm(hw, NVM_INIT_3GIO_3, 1, &buf);42094209+ if (le16_to_cpu(buf) & (3 << 2)) {42104210+ /* ASPM enable */42114211+ e_warn("Warning: detected ASPM enabled in EEPROM\n");41864212 }41874213}41884214···42154233 int i, err, pci_using_dac;42164234 u16 eeprom_data = 0;42174235 u16 eeprom_apme_mask = E1000_EEPROM_APME;42184218- int bars, need_ioport;4219423642204237 e1000e_disable_l1aspm(pdev);4221423842224222- /* do not allocate ioport bars when not needed */42234223- need_ioport = e1000e_is_need_ioport(pdev);42244224- if (need_ioport) {42254225- bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);42264226- err = pci_enable_device(pdev);42274227- } else {42284228- bars = pci_select_bars(pdev, IORESOURCE_MEM);42294229- err = pci_enable_device_mem(pdev);42304230- }42394239+ err = pci_enable_device_mem(pdev);42314240 if (err)42324241 return err;42334242···42414268 }42424269 }4243427042444244- err = pci_request_selected_regions(pdev, bars, e1000e_driver_name);42714271+ err = pci_request_selected_regions(pdev,42724272+ pci_select_bars(pdev, IORESOURCE_MEM),42734273+ e1000e_driver_name);42454274 if (err)42464275 goto err_pci_reg;42474276···42684293 adapter->hw.adapter = adapter;42694294 adapter->hw.mac.type = ei->mac;42704295 adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1;42714271- adapter->bars = bars;42724272- adapter->need_ioport = need_ioport;4273429642744297 mmio_start = pci_resource_start(pdev, 0);42754298 mmio_len = pci_resource_len(pdev, 0);···43394366 }4340436743414368 if (e1000_check_reset_block(&adapter->hw))43424342- ndev_info(netdev,43434343- "PHY reset is blocked due to SOL/IDER session.\n");43694369+ e_info("PHY reset is blocked due to SOL/IDER session.\n");4344437043454371 netdev->features = NETIF_F_SG |43464372 NETIF_F_HW_CSUM |···43834411 if (e1000_validate_nvm_checksum(&adapter->hw) >= 0)43844412 break;43854413 if (i == 2) {43864386- ndev_err(netdev, "The NVM Checksum Is Not Valid\n");44144414+ e_err("The NVM Checksum Is Not Valid\n");43874415 err = -EIO;43884416 goto err_eeprom;43894417 }43904418 }4391441944204420+ e1000_eeprom_checks(adapter);44214421+43924422 /* copy the MAC address out of the NVM */43934423 if (e1000e_read_mac_addr(&adapter->hw))43944394- ndev_err(netdev, "NVM Read Error while reading MAC address\n");44244424+ e_err("NVM Read Error while reading MAC address\n");4395442543964426 memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len);43974427 memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);4398442843994429 if (!is_valid_ether_addr(netdev->perm_addr)) {44004400- ndev_err(netdev, "Invalid MAC Address: "44014401- "%02x:%02x:%02x:%02x:%02x:%02x\n",44024402- netdev->perm_addr[0], netdev->perm_addr[1],44034403- netdev->perm_addr[2], netdev->perm_addr[3],44044404- netdev->perm_addr[4], netdev->perm_addr[5]);44304430+ e_err("Invalid MAC Address: %02x:%02x:%02x:%02x:%02x:%02x\n",44314431+ netdev->perm_addr[0], netdev->perm_addr[1],44324432+ netdev->perm_addr[2], netdev->perm_addr[3],44334433+ netdev->perm_addr[4], netdev->perm_addr[5]);44054434 err = -EIO;44064435 goto err_eeprom;44074436 }···44724499 * is up. For all other cases, let the f/w know that the h/w is now44734500 * under the control of the driver.44744501 */44754475- if (!(adapter->flags & FLAG_HAS_AMT) ||44764476- !e1000e_check_mng_mode(&adapter->hw))45024502+ if (!(adapter->flags & FLAG_HAS_AMT))44774503 e1000_get_hw_control(adapter);4478450444794505 /* tell the stack to leave us alone until e1000_open() is called */···44894517 return 0;4490451844914519err_register:44924492-err_hw_init:44934493- e1000_release_hw_control(adapter);45204520+ if (!(adapter->flags & FLAG_HAS_AMT))45214521+ e1000_release_hw_control(adapter);44944522err_eeprom:44954523 if (!e1000_check_reset_block(&adapter->hw))44964524 e1000_phy_hw_reset(&adapter->hw);45254525+err_hw_init:4497452644984498- if (adapter->hw.flash_address)44994499- iounmap(adapter->hw.flash_address);45004500-45014501-err_flashmap:45024527 kfree(adapter->tx_ring);45034528 kfree(adapter->rx_ring);45044529err_sw_init:45304530+ if (adapter->hw.flash_address)45314531+ iounmap(adapter->hw.flash_address);45324532+err_flashmap:45054533 iounmap(adapter->hw.hw_addr);45064534err_ioremap:45074535 free_netdev(netdev);45084536err_alloc_etherdev:45094509- pci_release_selected_regions(pdev, bars);45374537+ pci_release_selected_regions(pdev,45384538+ pci_select_bars(pdev, IORESOURCE_MEM));45104539err_pci_reg:45114540err_dma:45124541 pci_disable_device(pdev);···45554582 iounmap(adapter->hw.hw_addr);45564583 if (adapter->hw.flash_address)45574584 iounmap(adapter->hw.flash_address);45584558- pci_release_selected_regions(pdev, adapter->bars);45854585+ pci_release_selected_regions(pdev,45864586+ pci_select_bars(pdev, IORESOURCE_MEM));4559458745604588 free_netdev(netdev);45614589
+12-19
drivers/net/e1000e/param.c
···2727*******************************************************************************/28282929#include <linux/netdevice.h>3030+#include <linux/pci.h>30313132#include "e1000.h"3233···163162 case enable_option:164163 switch (*value) {165164 case OPTION_ENABLED:166166- ndev_info(adapter->netdev, "%s Enabled\n", opt->name);165165+ e_info("%s Enabled\n", opt->name);167166 return 0;168167 case OPTION_DISABLED:169169- ndev_info(adapter->netdev, "%s Disabled\n", opt->name);168168+ e_info("%s Disabled\n", opt->name);170169 return 0;171170 }172171 break;173172 case range_option:174173 if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) {175175- ndev_info(adapter->netdev,176176- "%s set to %i\n", opt->name, *value);174174+ e_info("%s set to %i\n", opt->name, *value);177175 return 0;178176 }179177 break;···184184 ent = &opt->arg.l.p[i];185185 if (*value == ent->i) {186186 if (ent->str[0] != '\0')187187- ndev_info(adapter->netdev, "%s\n",188188- ent->str);187187+ e_info("%s\n", ent->str);189188 return 0;190189 }191190 }···194195 BUG();195196 }196197197197- ndev_info(adapter->netdev, "Invalid %s value specified (%i) %s\n",198198- opt->name, *value, opt->err);198198+ e_info("Invalid %s value specified (%i) %s\n", opt->name, *value,199199+ opt->err);199200 *value = opt->def;200201 return -1;201202}···212213void __devinit e1000e_check_options(struct e1000_adapter *adapter)213214{214215 struct e1000_hw *hw = &adapter->hw;215215- struct net_device *netdev = adapter->netdev;216216 int bd = adapter->bd_number;217217218218 if (bd >= E1000_MAX_NIC) {219219- ndev_notice(netdev,220220- "Warning: no configuration for board #%i\n", bd);221221- ndev_notice(netdev, "Using defaults for all values\n");219219+ e_notice("Warning: no configuration for board #%i\n", bd);220220+ e_notice("Using defaults for all values\n");222221 }223222224223 { /* Transmit Interrupt Delay */···310313 adapter->itr = InterruptThrottleRate[bd];311314 switch (adapter->itr) {312315 case 0:313313- ndev_info(netdev, "%s turned off\n",314314- opt.name);316316+ e_info("%s turned off\n", opt.name);315317 break;316318 case 1:317317- ndev_info(netdev,318318- "%s set to dynamic mode\n",319319- opt.name);319319+ e_info("%s set to dynamic mode\n", opt.name);320320 adapter->itr_setting = adapter->itr;321321 adapter->itr = 20000;322322 break;323323 case 3:324324- ndev_info(netdev,325325- "%s set to dynamic conservative mode\n",324324+ e_info("%s set to dynamic conservative mode\n",326325 opt.name);327326 adapter->itr_setting = adapter->itr;328327 adapter->itr = 20000;
-8
drivers/net/eepro.c
···1283128312841284 if (dev->flags&(IFF_ALLMULTI|IFF_PROMISC) || dev->mc_count > 63)12851285 {12861286- /*12871287- * We must make the kernel realise we had to move12881288- * into promisc mode or we start all out war on12891289- * the cable. If it was a promisc request the12901290- * flag is already set. If not we assert it.12911291- */12921292- dev->flags|=IFF_PROMISC;12931293-12941286 eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */12951287 mode = inb(ioaddr + REG2);12961288 outb(mode | PRMSC_Mode, ioaddr + REG2);
-1
drivers/net/eth16i.c
···1356135613571357 if(dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC))13581358 {13591359- dev->flags|=IFF_PROMISC; /* Must do this */13601359 outb(3, ioaddr + RECEIVE_MODE_REG);13611360 } else {13621361 outb(2, ioaddr + RECEIVE_MODE_REG);
+70-40
drivers/net/forcedeth.c
···7777 * Hardware access:7878 */79798080-#define DEV_NEED_TIMERIRQ 0x00001 /* set the timer irq flag in the irq mask */8181-#define DEV_NEED_LINKTIMER 0x00002 /* poll link settings. Relies on the timer irq */8282-#define DEV_HAS_LARGEDESC 0x00004 /* device supports jumbo frames and needs packet format 2 */8383-#define DEV_HAS_HIGH_DMA 0x00008 /* device supports 64bit dma */8484-#define DEV_HAS_CHECKSUM 0x00010 /* device supports tx and rx checksum offloads */8585-#define DEV_HAS_VLAN 0x00020 /* device supports vlan tagging and striping */8686-#define DEV_HAS_MSI 0x00040 /* device supports MSI */8787-#define DEV_HAS_MSI_X 0x00080 /* device supports MSI-X */8888-#define DEV_HAS_POWER_CNTRL 0x00100 /* device supports power savings */8989-#define DEV_HAS_STATISTICS_V1 0x00200 /* device supports hw statistics version 1 */9090-#define DEV_HAS_STATISTICS_V2 0x00400 /* device supports hw statistics version 2 */9191-#define DEV_HAS_TEST_EXTENDED 0x00800 /* device supports extended diagnostic test */9292-#define DEV_HAS_MGMT_UNIT 0x01000 /* device supports management unit */9393-#define DEV_HAS_CORRECT_MACADDR 0x02000 /* device supports correct mac address order */9494-#define DEV_HAS_COLLISION_FIX 0x04000 /* device supports tx collision fix */9595-#define DEV_HAS_PAUSEFRAME_TX_V1 0x08000 /* device supports tx pause frames version 1 */9696-#define DEV_HAS_PAUSEFRAME_TX_V2 0x10000 /* device supports tx pause frames version 2 */9797-#define DEV_HAS_PAUSEFRAME_TX_V3 0x20000 /* device supports tx pause frames version 3 */9898-#define DEV_NEED_TX_LIMIT 0x40000 /* device needs to limit tx */9999-#define DEV_HAS_GEAR_MODE 0x80000 /* device supports gear mode */8080+#define DEV_NEED_TIMERIRQ 0x000001 /* set the timer irq flag in the irq mask */8181+#define DEV_NEED_LINKTIMER 0x000002 /* poll link settings. Relies on the timer irq */8282+#define DEV_HAS_LARGEDESC 0x000004 /* device supports jumbo frames and needs packet format 2 */8383+#define DEV_HAS_HIGH_DMA 0x000008 /* device supports 64bit dma */8484+#define DEV_HAS_CHECKSUM 0x000010 /* device supports tx and rx checksum offloads */8585+#define DEV_HAS_VLAN 0x000020 /* device supports vlan tagging and striping */8686+#define DEV_HAS_MSI 0x000040 /* device supports MSI */8787+#define DEV_HAS_MSI_X 0x000080 /* device supports MSI-X */8888+#define DEV_HAS_POWER_CNTRL 0x000100 /* device supports power savings */8989+#define DEV_HAS_STATISTICS_V1 0x000200 /* device supports hw statistics version 1 */9090+#define DEV_HAS_STATISTICS_V2 0x000400 /* device supports hw statistics version 2 */9191+#define DEV_HAS_STATISTICS_V3 0x000800 /* device supports hw statistics version 3 */9292+#define DEV_HAS_TEST_EXTENDED 0x001000 /* device supports extended diagnostic test */9393+#define DEV_HAS_MGMT_UNIT 0x002000 /* device supports management unit */9494+#define DEV_HAS_CORRECT_MACADDR 0x004000 /* device supports correct mac address order */9595+#define DEV_HAS_COLLISION_FIX 0x008000 /* device supports tx collision fix */9696+#define DEV_HAS_PAUSEFRAME_TX_V1 0x010000 /* device supports tx pause frames version 1 */9797+#define DEV_HAS_PAUSEFRAME_TX_V2 0x020000 /* device supports tx pause frames version 2 */9898+#define DEV_HAS_PAUSEFRAME_TX_V3 0x040000 /* device supports tx pause frames version 3 */9999+#define DEV_NEED_TX_LIMIT 0x080000 /* device needs to limit tx */100100+#define DEV_HAS_GEAR_MODE 0x100000 /* device supports gear mode */100101101102enum {102103 NvRegIrqStatus = 0x000,···249248#define NVREG_TX_PAUSEFRAME_ENABLE_V1 0x01800010250249#define NVREG_TX_PAUSEFRAME_ENABLE_V2 0x056003f0251250#define NVREG_TX_PAUSEFRAME_ENABLE_V3 0x09f00880251251+ NvRegTxPauseFrameLimit = 0x174,252252+#define NVREG_TX_PAUSEFRAMELIMIT_ENABLE 0x00010000252253 NvRegMIIStatus = 0x180,253254#define NVREG_MIISTAT_ERROR 0x0001254255#define NVREG_MIISTAT_LINKCHANGE 0x0008···273270#define NVREG_MIICTL_WRITE 0x00400274271#define NVREG_MIICTL_ADDRSHIFT 5275272 NvRegMIIData = 0x194,273273+ NvRegTxUnicast = 0x1a0,274274+ NvRegTxMulticast = 0x1a4,275275+ NvRegTxBroadcast = 0x1a8,276276 NvRegWakeUpFlags = 0x200,277277#define NVREG_WAKEUPFLAGS_VAL 0x7770278278#define NVREG_WAKEUPFLAGS_BUSYSHIFT 24···408402#define NV_RX_FRAMINGERR (1<<29)409403#define NV_RX_ERROR (1<<30)410404#define NV_RX_AVAIL (1<<31)405405+#define NV_RX_ERROR_MASK (NV_RX_ERROR1|NV_RX_ERROR2|NV_RX_ERROR3|NV_RX_ERROR4|NV_RX_CRCERR|NV_RX_OVERFLOW|NV_RX_FRAMINGERR)411406412407#define NV_RX2_CHECKSUMMASK (0x1C000000)413408#define NV_RX2_CHECKSUM_IP (0x10000000)···426419/* error and avail are the same for both */427420#define NV_RX2_ERROR (1<<30)428421#define NV_RX2_AVAIL (1<<31)422422+#define NV_RX2_ERROR_MASK (NV_RX2_ERROR1|NV_RX2_ERROR2|NV_RX2_ERROR3|NV_RX2_ERROR4|NV_RX2_CRCERR|NV_RX2_OVERFLOW|NV_RX2_FRAMINGERR)429423430424#define NV_RX3_VLAN_TAG_PRESENT (1<<16)431425#define NV_RX3_VLAN_TAG_MASK (0x0000FFFF)···624616 { "rx_bytes" },625617 { "tx_pause" },626618 { "rx_pause" },627627- { "rx_drop_frame" }619619+ { "rx_drop_frame" },620620+621621+ /* version 3 stats */622622+ { "tx_unicast" },623623+ { "tx_multicast" },624624+ { "tx_broadcast" }628625};629626630627struct nv_ethtool_stats {···665652 u64 tx_pause;666653 u64 rx_pause;667654 u64 rx_drop_frame;655655+656656+ /* version 3 stats */657657+ u64 tx_unicast;658658+ u64 tx_multicast;659659+ u64 tx_broadcast;668660};669661670670-#define NV_DEV_STATISTICS_V2_COUNT (sizeof(struct nv_ethtool_stats)/sizeof(u64))662662+#define NV_DEV_STATISTICS_V3_COUNT (sizeof(struct nv_ethtool_stats)/sizeof(u64))663663+#define NV_DEV_STATISTICS_V2_COUNT (NV_DEV_STATISTICS_V3_COUNT - 3)671664#define NV_DEV_STATISTICS_V1_COUNT (NV_DEV_STATISTICS_V2_COUNT - 6)672665673666/* diagnostics */···16471628 np->estats.rx_pause += readl(base + NvRegRxPause);16481629 np->estats.rx_drop_frame += readl(base + NvRegRxDropFrame);16491630 }16311631+16321632+ if (np->driver_data & DEV_HAS_STATISTICS_V3) {16331633+ np->estats.tx_unicast += readl(base + NvRegTxUnicast);16341634+ np->estats.tx_multicast += readl(base + NvRegTxMulticast);16351635+ np->estats.tx_broadcast += readl(base + NvRegTxBroadcast);16361636+ }16501637}1651163816521639/*···16661641 struct fe_priv *np = netdev_priv(dev);1667164216681643 /* If the nic supports hw counters then retrieve latest values */16691669- if (np->driver_data & (DEV_HAS_STATISTICS_V1|DEV_HAS_STATISTICS_V2)) {16441644+ if (np->driver_data & (DEV_HAS_STATISTICS_V1|DEV_HAS_STATISTICS_V2|DEV_HAS_STATISTICS_V3)) {16701645 nv_get_hw_stats(dev);1671164616721647 /* copy to net_device stats */···26572632 if (likely(flags & NV_RX_DESCRIPTORVALID)) {26582633 len = flags & LEN_MASK_V1;26592634 if (unlikely(flags & NV_RX_ERROR)) {26602660- if (flags & NV_RX_ERROR4) {26352635+ if ((flags & NV_RX_ERROR_MASK) == NV_RX_ERROR4) {26612636 len = nv_getlen(dev, skb->data, len);26622637 if (len < 0) {26632638 dev->stats.rx_errors++;···26662641 }26672642 }26682643 /* framing errors are soft errors */26692669- else if (flags & NV_RX_FRAMINGERR) {26442644+ else if ((flags & NV_RX_ERROR_MASK) == NV_RX_FRAMINGERR) {26702645 if (flags & NV_RX_SUBSTRACT1) {26712646 len--;26722647 }···26922667 if (likely(flags & NV_RX2_DESCRIPTORVALID)) {26932668 len = flags & LEN_MASK_V2;26942669 if (unlikely(flags & NV_RX2_ERROR)) {26952695- if (flags & NV_RX2_ERROR4) {26702670+ if ((flags & NV_RX2_ERROR_MASK) == NV_RX2_ERROR4) {26962671 len = nv_getlen(dev, skb->data, len);26972672 if (len < 0) {26982673 dev->stats.rx_errors++;···27012676 }27022677 }27032678 /* framing errors are soft errors */27042704- else if (flags & NV_RX2_FRAMINGERR) {26792679+ else if ((flags & NV_RX2_ERROR_MASK) == NV_RX2_FRAMINGERR) {27052680 if (flags & NV_RX2_SUBSTRACT1) {27062681 len--;27072682 }···27912766 if (likely(flags & NV_RX2_DESCRIPTORVALID)) {27922767 len = flags & LEN_MASK_V2;27932768 if (unlikely(flags & NV_RX2_ERROR)) {27942794- if (flags & NV_RX2_ERROR4) {27692769+ if ((flags & NV_RX2_ERROR_MASK) == NV_RX2_ERROR4) {27952770 len = nv_getlen(dev, skb->data, len);27962771 if (len < 0) {27972772 dev_kfree_skb(skb);···27992774 }28002775 }28012776 /* framing errors are soft errors */28022802- else if (flags & NV_RX2_FRAMINGERR) {27772777+ else if ((flags & NV_RX2_ERROR_MASK) == NV_RX2_FRAMINGERR) {28032778 if (flags & NV_RX2_SUBSTRACT1) {28042779 len--;28052780 }···30783053 u32 pause_enable = NVREG_TX_PAUSEFRAME_ENABLE_V1;30793054 if (np->driver_data & DEV_HAS_PAUSEFRAME_TX_V2)30803055 pause_enable = NVREG_TX_PAUSEFRAME_ENABLE_V2;30813081- if (np->driver_data & DEV_HAS_PAUSEFRAME_TX_V3)30563056+ if (np->driver_data & DEV_HAS_PAUSEFRAME_TX_V3) {30823057 pause_enable = NVREG_TX_PAUSEFRAME_ENABLE_V3;30583058+ /* limit the number of tx pause frames to a default of 8 */30593059+ writel(readl(base + NvRegTxPauseFrameLimit)|NVREG_TX_PAUSEFRAMELIMIT_ENABLE, base + NvRegTxPauseFrameLimit);30603060+ }30833061 writel(pause_enable, base + NvRegTxPauseFrame);30843062 writel(regmisc|NVREG_MISC1_PAUSE_TX, base + NvRegMisc1);30853063 np->pause_flags |= NV_PAUSEFRAME_TX_ENABLE;···47684740 return NV_DEV_STATISTICS_V1_COUNT;47694741 else if (np->driver_data & DEV_HAS_STATISTICS_V2)47704742 return NV_DEV_STATISTICS_V2_COUNT;47434743+ else if (np->driver_data & DEV_HAS_STATISTICS_V3)47444744+ return NV_DEV_STATISTICS_V3_COUNT;47714745 else47724746 return 0;47734747 default:···53545324 mod_timer(&np->oom_kick, jiffies + OOM_REFILL);5355532553565326 /* start statistics timer */53575357- if (np->driver_data & (DEV_HAS_STATISTICS_V1|DEV_HAS_STATISTICS_V2))53275327+ if (np->driver_data & (DEV_HAS_STATISTICS_V1|DEV_HAS_STATISTICS_V2|DEV_HAS_STATISTICS_V3))53585328 mod_timer(&np->stats_poll,53595329 round_jiffies(jiffies + STATS_INTERVAL));53605330···54585428 if (err < 0)54595429 goto out_disable;5460543054615461- if (id->driver_data & (DEV_HAS_VLAN|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL|DEV_HAS_STATISTICS_V2))54315431+ if (id->driver_data & (DEV_HAS_VLAN|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL|DEV_HAS_STATISTICS_V2|DEV_HAS_STATISTICS_V3))54625432 np->register_size = NV_PCI_REGSZ_VER3;54635433 else if (id->driver_data & DEV_HAS_STATISTICS_V1)54645434 np->register_size = NV_PCI_REGSZ_VER2;···61136083 },61146084 { /* MCP77 Ethernet Controller */61156085 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_32),61166116- .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V2|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,60866086+ .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V2|DEV_HAS_STATISTICS_V3|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,61176087 },61186088 { /* MCP77 Ethernet Controller */61196089 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_33),61206120- .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V2|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,60906090+ .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V2|DEV_HAS_STATISTICS_V3|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,61216091 },61226092 { /* MCP77 Ethernet Controller */61236093 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_34),61246124- .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V2|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,60946094+ .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V2|DEV_HAS_STATISTICS_V3|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,61256095 },61266096 { /* MCP77 Ethernet Controller */61276097 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_35),61286128- .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V2|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,60986098+ .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V2|DEV_HAS_STATISTICS_V3|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,61296099 },61306100 { /* MCP79 Ethernet Controller */61316101 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_36),61326132- .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V3|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,61026102+ .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V3|DEV_HAS_STATISTICS_V3|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,61336103 },61346104 { /* MCP79 Ethernet Controller */61356105 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_37),61366136- .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V3|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,61066106+ .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V3|DEV_HAS_STATISTICS_V3|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,61376107 },61386108 { /* MCP79 Ethernet Controller */61396109 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_38),61406140- .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V3|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,61106110+ .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V3|DEV_HAS_STATISTICS_V3|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,61416111 },61426112 { /* MCP79 Ethernet Controller */61436113 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_39),61446144- .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V3|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,61146114+ .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX_V3|DEV_HAS_STATISTICS_V3|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR|DEV_HAS_COLLISION_FIX|DEV_NEED_TX_LIMIT|DEV_HAS_GEAR_MODE,61456115 },61466116 {0,},61476117};
···850850 for (; mc_addr_count > 0; mc_addr_count--) {851851 hash_value = igb_hash_mc_addr(hw, mc_addr_list);852852 hw_dbg("Hash value = 0x%03X\n", hash_value);853853- hw->mac.ops.mta_set(hw, hash_value);853853+ igb_mta_set(hw, hash_value);854854 mc_addr_list += ETH_ALEN;855855 }856856}···11361136 E1000_PCS_LCTL_FORCE_LINK; /* Force Link */11371137 hw_dbg("Configuring Forced Link; PCS_LCTL = 0x%08X\n", reg);11381138 }11391139+11401140+ if (hw->mac.type == e1000_82576) {11411141+ reg |= E1000_PCS_LCTL_FORCE_FCTRL;11421142+ igb_force_mac_fc(hw);11431143+ }11441144+11391145 wr32(E1000_PCS_LCTL, reg);1140114611411147 return 0;···1235122912361230out:12371231 return ret_val;12381238-}12391239-12401240-/**12411241- * igb_translate_register_82576 - Translate the proper register offset12421242- * @reg: e1000 register to be read12431243- *12441244- * Registers in 82576 are located in different offsets than other adapters12451245- * even though they function in the same manner. This function takes in12461246- * the name of the register to read and returns the correct offset for12471247- * 82576 silicon.12481248- **/12491249-u32 igb_translate_register_82576(u32 reg)12501250-{12511251- /*12521252- * Some of the Kawela registers are located at different12531253- * offsets than they are in older adapters.12541254- * Despite the difference in location, the registers12551255- * function in the same manner.12561256- */12571257- switch (reg) {12581258- case E1000_TDBAL(0):12591259- reg = 0x0E000;12601260- break;12611261- case E1000_TDBAH(0):12621262- reg = 0x0E004;12631263- break;12641264- case E1000_TDLEN(0):12651265- reg = 0x0E008;12661266- break;12671267- case E1000_TDH(0):12681268- reg = 0x0E010;12691269- break;12701270- case E1000_TDT(0):12711271- reg = 0x0E018;12721272- break;12731273- case E1000_TXDCTL(0):12741274- reg = 0x0E028;12751275- break;12761276- case E1000_RDBAL(0):12771277- reg = 0x0C000;12781278- break;12791279- case E1000_RDBAH(0):12801280- reg = 0x0C004;12811281- break;12821282- case E1000_RDLEN(0):12831283- reg = 0x0C008;12841284- break;12851285- case E1000_RDH(0):12861286- reg = 0x0C010;12871287- break;12881288- case E1000_RDT(0):12891289- reg = 0x0C018;12901290- break;12911291- case E1000_RXDCTL(0):12921292- reg = 0x0C028;12931293- break;12941294- case E1000_SRRCTL(0):12951295- reg = 0x0C00C;12961296- break;12971297- default:12981298- break;12991299- }13001300-13011301- return reg;13021232}1303123313041234/**
···144144}145145146146/**147147- * igb_init_rx_addrs - Initialize receive address's148148- * @hw: pointer to the HW structure149149- * @rar_count: receive address registers150150- *151151- * Setups the receive address registers by setting the base receive address152152- * register to the devices MAC address and clearing all the other receive153153- * address registers to 0.154154- **/155155-void igb_init_rx_addrs(struct e1000_hw *hw, u16 rar_count)156156-{157157- u32 i;158158-159159- /* Setup the receive address */160160- hw_dbg("Programming MAC Address into RAR[0]\n");161161-162162- hw->mac.ops.rar_set(hw, hw->mac.addr, 0);163163-164164- /* Zero out the other (rar_entry_count - 1) receive addresses */165165- hw_dbg("Clearing RAR[1-%u]\n", rar_count-1);166166- for (i = 1; i < rar_count; i++) {167167- array_wr32(E1000_RA, (i << 1), 0);168168- wrfl();169169- array_wr32(E1000_RA, ((i << 1) + 1), 0);170170- wrfl();171171- }172172-}173173-174174-/**175147 * igb_check_alt_mac_addr - Check for alternate MAC addr176148 * @hw: pointer to the HW structure177149 *···243271 * current value is read, the new bit is OR'd in and the new value is244272 * written back into the register.245273 **/246246-static void igb_mta_set(struct e1000_hw *hw, u32 hash_value)274274+void igb_mta_set(struct e1000_hw *hw, u32 hash_value)247275{248276 u32 hash_bit, hash_reg, mta;249277···266294267295 array_wr32(E1000_MTA, hash_reg, mta);268296 wrfl();269269-}270270-271271-/**272272- * igb_update_mc_addr_list - Update Multicast addresses273273- * @hw: pointer to the HW structure274274- * @mc_addr_list: array of multicast addresses to program275275- * @mc_addr_count: number of multicast addresses to program276276- * @rar_used_count: the first RAR register free to program277277- * @rar_count: total number of supported Receive Address Registers278278- *279279- * Updates the Receive Address Registers and Multicast Table Array.280280- * The caller must have a packed mc_addr_list of multicast addresses.281281- * The parameter rar_count will usually be hw->mac.rar_entry_count282282- * unless there are workarounds that change this.283283- **/284284-void igb_update_mc_addr_list(struct e1000_hw *hw,285285- u8 *mc_addr_list, u32 mc_addr_count,286286- u32 rar_used_count, u32 rar_count)287287-{288288- u32 hash_value;289289- u32 i;290290-291291- /*292292- * Load the first set of multicast addresses into the exact293293- * filters (RAR). If there are not enough to fill the RAR294294- * array, clear the filters.295295- */296296- for (i = rar_used_count; i < rar_count; i++) {297297- if (mc_addr_count) {298298- hw->mac.ops.rar_set(hw, mc_addr_list, i);299299- mc_addr_count--;300300- mc_addr_list += ETH_ALEN;301301- } else {302302- array_wr32(E1000_RA, i << 1, 0);303303- wrfl();304304- array_wr32(E1000_RA, (i << 1) + 1, 0);305305- wrfl();306306- }307307- }308308-309309- /* Clear the old settings from the MTA */310310- hw_dbg("Clearing MTA\n");311311- for (i = 0; i < hw->mac.mta_reg_count; i++) {312312- array_wr32(E1000_MTA, i, 0);313313- wrfl();314314- }315315-316316- /* Load any remaining multicast addresses into the hash table. */317317- for (; mc_addr_count > 0; mc_addr_count--) {318318- hash_value = igb_hash_mc_addr(hw, mc_addr_list);319319- hw_dbg("Hash value = 0x%03X\n", hash_value);320320- igb_mta_set(hw, hash_value);321321- mc_addr_list += ETH_ALEN;322322- }323297}324298325299/**
···311311 array_wr32(E1000_MSIXBM(0), msix_vector, msixbm);312312 break;313313 case e1000_82576:314314- /* Kawela uses a table-based method for assigning vectors.314314+ /* The 82576 uses a table-based method for assigning vectors.315315 Each queue has a single entry in the table to which we write316316 a vector number along with a "valid" bit. Sadly, the layout317317 of the table is somewhat counterintuitive. */···720720 ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);721721}722722723723-static void igb_init_manageability(struct igb_adapter *adapter)724724-{725725- struct e1000_hw *hw = &adapter->hw;726726-727727- if (adapter->en_mng_pt) {728728- u32 manc2h = rd32(E1000_MANC2H);729729- u32 manc = rd32(E1000_MANC);730730-731731- /* enable receiving management packets to the host */732732- /* this will probably generate destination unreachable messages733733- * from the host OS, but the packets will be handled on SMBUS */734734- manc |= E1000_MANC_EN_MNG2HOST;735735-#define E1000_MNG2HOST_PORT_623 (1 << 5)736736-#define E1000_MNG2HOST_PORT_664 (1 << 6)737737- manc2h |= E1000_MNG2HOST_PORT_623;738738- manc2h |= E1000_MNG2HOST_PORT_664;739739- wr32(E1000_MANC2H, manc2h);740740-741741- wr32(E1000_MANC, manc);742742- }743743-}744744-745723/**746724 * igb_configure - configure the hardware for RX and TX747725 * @adapter: private board structure···733755 igb_set_multi(netdev);734756735757 igb_restore_vlan(adapter);736736- igb_init_manageability(adapter);737758738759 igb_configure_tx(adapter);739760 igb_setup_rctl(adapter);···1349137213501373 unregister_netdev(netdev);1351137413521352- if (!igb_check_reset_block(&adapter->hw))13751375+ if (adapter->hw.phy.ops.reset_phy &&13761376+ !igb_check_reset_block(&adapter->hw))13531377 adapter->hw.phy.ops.reset_phy(&adapter->hw);1354137813551379 igb_remove_device(&adapter->hw);···45004522{45014523 struct net_device *netdev = pci_get_drvdata(pdev);45024524 struct igb_adapter *adapter = netdev_priv(netdev);45034503-45044504- igb_init_manageability(adapter);4505452545064526 if (netif_running(netdev)) {45074527 if (igb_up(adapter)) {
···101101#define MXGEFW_ETH_SEND_3 0x2c0000102102#define MXGEFW_ETH_RECV_SMALL 0x300000103103#define MXGEFW_ETH_RECV_BIG 0x340000104104+#define MXGEFW_ETH_SEND_GO 0x380000105105+#define MXGEFW_ETH_SEND_STOP 0x3C0000104106105107#define MXGEFW_ETH_SEND(n) (0x200000 + (((n) & 0x03) * 0x40000))106108#define MXGEFW_ETH_SEND_OFFSET(n) (MXGEFW_ETH_SEND(n) - MXGEFW_ETH_SEND_4)···122120 * MXGEFW_CMD_RESET is issued */123121124122 MXGEFW_CMD_SET_INTRQ_DMA,123123+ /* data0 = LSW of the host address124124+ * data1 = MSW of the host address125125+ * data2 = slice number if multiple slices are used126126+ */127127+125128 MXGEFW_CMD_SET_BIG_BUFFER_SIZE, /* in bytes, power of 2 */126129 MXGEFW_CMD_SET_SMALL_BUFFER_SIZE, /* in bytes */127130···136129 MXGEFW_CMD_GET_SEND_OFFSET,137130 MXGEFW_CMD_GET_SMALL_RX_OFFSET,138131 MXGEFW_CMD_GET_BIG_RX_OFFSET,132132+ /* data0 = slice number if multiple slices are used */133133+139134 MXGEFW_CMD_GET_IRQ_ACK_OFFSET,140135 MXGEFW_CMD_GET_IRQ_DEASSERT_OFFSET,141136···209200 MXGEFW_CMD_SET_STATS_DMA_V2,210201 /* data0, data1 = bus addr,211202 * data2 = sizeof(struct mcp_irq_data) from driver point of view, allows212212- * adding new stuff to mcp_irq_data without changing the ABI */203203+ * adding new stuff to mcp_irq_data without changing the ABI204204+ *205205+ * If multiple slices are used, data2 contains both the size of the206206+ * structure (in the lower 16 bits) and the slice number207207+ * (in the upper 16 bits).208208+ */213209214210 MXGEFW_CMD_UNALIGNED_TEST,215211 /* same than DMA_TEST (same args) but abort with UNALIGNED on unaligned···236222 MXGEFW_CMD_GET_MAX_RSS_QUEUES,237223 MXGEFW_CMD_ENABLE_RSS_QUEUES,238224 /* data0 = number of slices n (0, 1, ..., n-1) to enable239239- * data1 = interrupt mode.240240- * 0=share one INTx/MSI, 1=use one MSI-X per queue.225225+ * data1 = interrupt mode | use of multiple transmit queues.226226+ * 0=share one INTx/MSI.227227+ * 1=use one MSI-X per queue.241228 * If all queues share one interrupt, the driver must have set242229 * RSS_SHARED_INTERRUPT_DMA before enabling queues.230230+ * 2=enable both receive and send queues.231231+ * Without this bit set, only one send queue (slice 0's send queue)232232+ * is enabled. The receive queues are always enabled.243233 */244244-#define MXGEFW_SLICE_INTR_MODE_SHARED 0245245-#define MXGEFW_SLICE_INTR_MODE_ONE_PER_SLICE 1234234+#define MXGEFW_SLICE_INTR_MODE_SHARED 0x0235235+#define MXGEFW_SLICE_INTR_MODE_ONE_PER_SLICE 0x1236236+#define MXGEFW_SLICE_ENABLE_MULTIPLE_TX_QUEUES 0x2246237247238 MXGEFW_CMD_GET_RSS_SHARED_INTERRUPT_MASK_OFFSET,248239 MXGEFW_CMD_SET_RSS_SHARED_INTERRUPT_DMA,···269250 * 2: TCP_IPV4 (required by RSS)270251 * 3: IPV4 | TCP_IPV4 (required by RSS)271252 * 4: source port253253+ * 5: source port + destination port272254 */273255#define MXGEFW_RSS_HASH_TYPE_IPV4 0x1274256#define MXGEFW_RSS_HASH_TYPE_TCP_IPV4 0x2275257#define MXGEFW_RSS_HASH_TYPE_SRC_PORT 0x4258258+#define MXGEFW_RSS_HASH_TYPE_SRC_DST_PORT 0x5259259+#define MXGEFW_RSS_HASH_TYPE_MAX 0x5276260277261 MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE,278262 /* Return data = the max. size of the entire headers of a IPv6 TSO packet.···351329352330 MXGEFW_CMD_GET_DCA_OFFSET,353331 /* offset of dca control for WDMAs */332332+333333+ /* VMWare NetQueue commands */334334+ MXGEFW_CMD_NETQ_GET_FILTERS_PER_QUEUE,335335+ MXGEFW_CMD_NETQ_ADD_FILTER,336336+ /* data0 = filter_id << 16 | queue << 8 | type */337337+ /* data1 = MS4 of MAC Addr */338338+ /* data2 = LS2_MAC << 16 | VLAN_tag */339339+ MXGEFW_CMD_NETQ_DEL_FILTER,340340+ /* data0 = filter_id */341341+ MXGEFW_CMD_NETQ_QUERY1,342342+ MXGEFW_CMD_NETQ_QUERY2,343343+ MXGEFW_CMD_NETQ_QUERY3,344344+ MXGEFW_CMD_NETQ_QUERY4,345345+354346};355347356348enum myri10ge_mcp_cmd_status {···416380 u8 stats_updated;417381 u8 valid;418382};383383+384384+/* definitions for NETQ filter type */385385+#define MXGEFW_NETQ_FILTERTYPE_NONE 0386386+#define MXGEFW_NETQ_FILTERTYPE_MACADDR 1387387+#define MXGEFW_NETQ_FILTERTYPE_VLAN 2388388+#define MXGEFW_NETQ_FILTERTYPE_VLANMACADDR 3419389420390#endif /* __MYRI10GE_MCP_H__ */
+1-1
drivers/net/myri10ge/myri10ge_mcp_gen_header.h
···3535 unsigned char mcp_index;3636 unsigned char disable_rabbit;3737 unsigned char unaligned_tlp;3838- unsigned char pad1;3838+ unsigned char pcie_link_algo;3939 unsigned counters_addr;4040 unsigned copy_block_info; /* for small mcps loaded with "lload -d" */4141 unsigned short handoff_id_major; /* must be equal */
···275275 PC_VAUX_ON | PC_VCC_OFF));276276}277277278278-static void sky2_power_state(struct sky2_hw *hw, pci_power_t state)279279-{280280- u16 power_control = sky2_pci_read16(hw, hw->pm_cap + PCI_PM_CTRL);281281- int pex = pci_find_capability(hw->pdev, PCI_CAP_ID_EXP);282282- u32 reg;283283-284284- sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);285285-286286- switch (state) {287287- case PCI_D0:288288- break;289289-290290- case PCI_D1:291291- power_control |= 1;292292- break;293293-294294- case PCI_D2:295295- power_control |= 2;296296- break;297297-298298- case PCI_D3hot:299299- case PCI_D3cold:300300- power_control |= 3;301301- if (hw->flags & SKY2_HW_ADV_POWER_CTL) {302302- /* additional power saving measurements */303303- reg = sky2_pci_read32(hw, PCI_DEV_REG4);304304-305305- /* set gating core clock for LTSSM in L1 state */306306- reg |= P_PEX_LTSSM_STAT(P_PEX_LTSSM_L1_STAT) |307307- /* auto clock gated scheme controlled by CLKREQ */308308- P_ASPM_A1_MODE_SELECT |309309- /* enable Gate Root Core Clock */310310- P_CLK_GATE_ROOT_COR_ENA;311311-312312- if (pex && (hw->flags & SKY2_HW_CLK_POWER)) {313313- /* enable Clock Power Management (CLKREQ) */314314- u16 ctrl = sky2_pci_read16(hw, pex + PCI_EXP_DEVCTL);315315-316316- ctrl |= PCI_EXP_DEVCTL_AUX_PME;317317- sky2_pci_write16(hw, pex + PCI_EXP_DEVCTL, ctrl);318318- } else319319- /* force CLKREQ Enable in Our4 (A1b only) */320320- reg |= P_ASPM_FORCE_CLKREQ_ENA;321321-322322- /* set Mask Register for Release/Gate Clock */323323- sky2_pci_write32(hw, PCI_DEV_REG5,324324- P_REL_PCIE_EXIT_L1_ST | P_GAT_PCIE_ENTER_L1_ST |325325- P_REL_PCIE_RX_EX_IDLE | P_GAT_PCIE_RX_EL_IDLE |326326- P_REL_GPHY_LINK_UP | P_GAT_GPHY_LINK_DOWN);327327- } else328328- sky2_write8(hw, B28_Y2_ASF_STAT_CMD, Y2_ASF_CLK_HALT);329329-330330- /* put CPU into reset state */331331- sky2_write8(hw, B28_Y2_ASF_STAT_CMD, HCU_CCSR_ASF_RESET);332332- if (hw->chip_id == CHIP_ID_YUKON_SUPR && hw->chip_rev == CHIP_REV_YU_SU_A0)333333- /* put CPU into halt state */334334- sky2_write8(hw, B28_Y2_ASF_STAT_CMD, HCU_CCSR_ASF_HALTED);335335-336336- if (pex && !(hw->flags & SKY2_HW_RAM_BUFFER)) {337337- reg = sky2_pci_read32(hw, PCI_DEV_REG1);338338- /* force to PCIe L1 */339339- reg |= PCI_FORCE_PEX_L1;340340- sky2_pci_write32(hw, PCI_DEV_REG1, reg);341341- }342342- break;343343-344344- default:345345- dev_warn(&hw->pdev->dev, PFX "Invalid power state (%d) ",346346- state);347347- return;348348- }349349-350350- power_control |= PCI_PM_CTRL_PME_ENABLE;351351- /* Finally, set the new power state. */352352- sky2_pci_write32(hw, hw->pm_cap + PCI_PM_CTRL, power_control);353353-354354- sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);355355- sky2_pci_read32(hw, B0_CTST);356356-}357357-358278static void sky2_gmac_reset(struct sky2_hw *hw, unsigned port)359279{360280 u16 reg;···629709 sky2_pci_write32(hw, PCI_DEV_REG1, reg1);630710 sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);631711 sky2_pci_read32(hw, PCI_DEV_REG1);712712+713713+ if (hw->chip_id == CHIP_ID_YUKON_FE)714714+ gm_phy_write(hw, port, PHY_MARV_CTRL, PHY_CT_ANE);715715+ else if (hw->flags & SKY2_HW_ADV_POWER_CTL)716716+ sky2_write8(hw, SK_REG(port, GPHY_CTRL), GPC_RST_CLR);632717}633718634719static void sky2_phy_power_down(struct sky2_hw *hw, unsigned port)···27802855 hw->flags = SKY2_HW_GIGABIT27812856 | SKY2_HW_NEWER_PHY27822857 | SKY2_HW_ADV_POWER_CTL;27832783-27842784- /* check for Rev. A1 dev 4200 */27852785- if (sky2_read16(hw, Q_ADDR(Q_XA1, Q_WM)) == 0)27862786- hw->flags |= SKY2_HW_CLK_POWER;27872858 break;2788285927892860 case CHIP_ID_YUKON_EX:···28342913 hw->pmd_type = sky2_read8(hw, B2_PMD_TYP);28352914 if (hw->pmd_type == 'L' || hw->pmd_type == 'S' || hw->pmd_type == 'P')28362915 hw->flags |= SKY2_HW_FIBRE_PHY;28372837-28382838- hw->pm_cap = pci_find_capability(hw->pdev, PCI_CAP_ID_PM);28392839- if (hw->pm_cap == 0) {28402840- dev_err(&hw->pdev->dev, "cannot find PowerManagement capability\n");28412841- return -EIO;28422842- }2843291628442917 hw->ports = 1;28452918 t8 = sky2_read8(hw, B2_Y2_HW_RES);···4427451244284513 pci_save_state(pdev);44294514 pci_enable_wake(pdev, pci_choose_state(pdev, state), wol);44304430- sky2_power_state(hw, pci_choose_state(pdev, state));45154515+ pci_set_power_state(pdev, pci_choose_state(pdev, state));4431451644324517 return 0;44334518}···44404525 if (!hw)44414526 return 0;4442452744434443- sky2_power_state(hw, PCI_D0);45284528+ err = pci_set_power_state(pdev, PCI_D0);45294529+ if (err)45304530+ goto out;4444453144454532 err = pci_restore_state(pdev);44464533 if (err)···45124595 pci_enable_wake(pdev, PCI_D3cold, wol);4513459645144597 pci_disable_device(pdev);45154515- sky2_power_state(hw, PCI_D3hot);45984598+ pci_set_power_state(pdev, PCI_D3hot);45164599}4517460045184601static struct pci_driver sky2_driver = {
-2
drivers/net/sky2.h
···20722072#define SKY2_HW_NEW_LE 0x00000020 /* new LSOv2 format */20732073#define SKY2_HW_AUTO_TX_SUM 0x00000040 /* new IP decode for Tx */20742074#define SKY2_HW_ADV_POWER_CTL 0x00000080 /* additional PHY power regs */20752075-#define SKY2_HW_CLK_POWER 0x00000100 /* clock power management */2076207520772077- int pm_cap;20782076 u8 chip_id;20792077 u8 chip_rev;20802078 u8 pmd_type;
···12851285 }12861286}1287128712881288+static int pegasus_blacklisted(struct usb_device *udev)12891289+{12901290+ struct usb_device_descriptor *udd = &udev->descriptor;12911291+12921292+ /* Special quirk to keep the driver from handling the Belkin Bluetooth12931293+ * dongle which happens to have the same ID.12941294+ */12951295+ if ((udd->idVendor == VENDOR_BELKIN && udd->idProduct == 0x0121) &&12961296+ (udd->bDeviceClass == USB_CLASS_WIRELESS_CONTROLLER) &&12971297+ (udd->bDeviceProtocol == 1))12981298+ return 1;12991299+13001300+ return 0;13011301+}13021302+12881303static int pegasus_probe(struct usb_interface *intf,12891304 const struct usb_device_id *id)12901305{···13111296 DECLARE_MAC_BUF(mac);1312129713131298 usb_get_dev(dev);12991299+13001300+ if (pegasus_blacklisted(dev)) {13011301+ res = -ENODEV;13021302+ goto out;13031303+ }13041304+13141305 net = alloc_etherdev(sizeof(struct pegasus));13151306 if (!net) {13161307 dev_err(&intf->dev, "can't allocate %s\n", "device");
+173-132
drivers/net/via-velocity.c
···662662 spin_unlock_irq(&vptr->lock);663663}664664665665+static void velocity_init_rx_ring_indexes(struct velocity_info *vptr)666666+{667667+ vptr->rx.dirty = vptr->rx.filled = vptr->rx.curr = 0;668668+}665669666670/**667671 * velocity_rx_reset - handle a receive reset···681677 struct mac_regs __iomem * regs = vptr->mac_regs;682678 int i;683679684684- vptr->rd_dirty = vptr->rd_filled = vptr->rd_curr = 0;680680+ velocity_init_rx_ring_indexes(vptr);685681686682 /*687683 * Init state, all RD entries belong to the NIC688684 */689685 for (i = 0; i < vptr->options.numrx; ++i)690690- vptr->rd_ring[i].rdesc0.len |= OWNED_BY_NIC;686686+ vptr->rx.ring[i].rdesc0.len |= OWNED_BY_NIC;691687692688 writew(vptr->options.numrx, ®s->RBRDU);693693- writel(vptr->rd_pool_dma, ®s->RDBaseLo);689689+ writel(vptr->rx.pool_dma, ®s->RDBaseLo);694690 writew(0, ®s->RDIdx);695691 writew(vptr->options.numrx - 1, ®s->RDCSize);696692}···783779784780 vptr->int_mask = INT_MASK_DEF;785781786786- writel(vptr->rd_pool_dma, ®s->RDBaseLo);782782+ writel(vptr->rx.pool_dma, ®s->RDBaseLo);787783 writew(vptr->options.numrx - 1, ®s->RDCSize);788784 mac_rx_queue_run(regs);789785 mac_rx_queue_wake(regs);790786791787 writew(vptr->options.numtx - 1, ®s->TDCSize);792788793793- for (i = 0; i < vptr->num_txq; i++) {794794- writel(vptr->td_pool_dma[i], ®s->TDBaseLo[i]);789789+ for (i = 0; i < vptr->tx.numq; i++) {790790+ writel(vptr->tx.pool_dma[i], ®s->TDBaseLo[i]);795791 mac_tx_queue_run(regs, i);796792 }797793···1051104710521048 vptr->pdev = pdev;10531049 vptr->chip_id = info->chip_id;10541054- vptr->num_txq = info->txqueue;10501050+ vptr->tx.numq = info->txqueue;10551051 vptr->multicast_limit = MCAM_SIZE;10561052 spin_lock_init(&vptr->lock);10571053 INIT_LIST_HEAD(&vptr->list);···10971093}1098109410991095/**11001100- * velocity_init_rings - set up DMA rings10961096+ * velocity_init_dma_rings - set up DMA rings11011097 * @vptr: Velocity to set up11021098 *11031099 * Allocate PCI mapped DMA rings for the receive and transmit layer11041100 * to use.11051101 */1106110211071107-static int velocity_init_rings(struct velocity_info *vptr)11031103+static int velocity_init_dma_rings(struct velocity_info *vptr)11081104{11091105 struct velocity_opt *opt = &vptr->options;11101106 const unsigned int rx_ring_size = opt->numrx * sizeof(struct rx_desc);···11201116 * pci_alloc_consistent() fulfills the requirement for 64 bytes11211117 * alignment11221118 */11231123- pool = pci_alloc_consistent(pdev, tx_ring_size * vptr->num_txq +11191119+ pool = pci_alloc_consistent(pdev, tx_ring_size * vptr->tx.numq +11241120 rx_ring_size, &pool_dma);11251121 if (!pool) {11261122 dev_err(&pdev->dev, "%s : DMA memory allocation failed.\n",···11281124 return -ENOMEM;11291125 }1130112611311131- vptr->rd_ring = pool;11321132- vptr->rd_pool_dma = pool_dma;11271127+ vptr->rx.ring = pool;11281128+ vptr->rx.pool_dma = pool_dma;1133112911341130 pool += rx_ring_size;11351131 pool_dma += rx_ring_size;1136113211371137- for (i = 0; i < vptr->num_txq; i++) {11381138- vptr->td_rings[i] = pool;11391139- vptr->td_pool_dma[i] = pool_dma;11331133+ for (i = 0; i < vptr->tx.numq; i++) {11341134+ vptr->tx.rings[i] = pool;11351135+ vptr->tx.pool_dma[i] = pool_dma;11401136 pool += tx_ring_size;11411137 pool_dma += tx_ring_size;11421138 }···11451141}1146114211471143/**11481148- * velocity_free_rings - free PCI ring pointers11441144+ * velocity_free_dma_rings - free PCI ring pointers11491145 * @vptr: Velocity to free from11501146 *11511147 * Clean up the PCI ring buffers allocated to this velocity.11521148 */1153114911541154-static void velocity_free_rings(struct velocity_info *vptr)11501150+static void velocity_free_dma_rings(struct velocity_info *vptr)11551151{11561152 const int size = vptr->options.numrx * sizeof(struct rx_desc) +11571157- vptr->options.numtx * sizeof(struct tx_desc) * vptr->num_txq;11531153+ vptr->options.numtx * sizeof(struct tx_desc) * vptr->tx.numq;1158115411591159- pci_free_consistent(vptr->pdev, size, vptr->rd_ring, vptr->rd_pool_dma);11551155+ pci_free_consistent(vptr->pdev, size, vptr->rx.ring, vptr->rx.pool_dma);11601156}1161115711621158static void velocity_give_many_rx_descs(struct velocity_info *vptr)···11681164 * RD number must be equal to 4X per hardware spec11691165 * (programming guide rev 1.20, p.13)11701166 */11711171- if (vptr->rd_filled < 4)11671167+ if (vptr->rx.filled < 4)11721168 return;1173116911741170 wmb();1175117111761176- unusable = vptr->rd_filled & 0x0003;11771177- dirty = vptr->rd_dirty - unusable;11781178- for (avail = vptr->rd_filled & 0xfffc; avail; avail--) {11721172+ unusable = vptr->rx.filled & 0x0003;11731173+ dirty = vptr->rx.dirty - unusable;11741174+ for (avail = vptr->rx.filled & 0xfffc; avail; avail--) {11791175 dirty = (dirty > 0) ? dirty - 1 : vptr->options.numrx - 1;11801180- vptr->rd_ring[dirty].rdesc0.len |= OWNED_BY_NIC;11761176+ vptr->rx.ring[dirty].rdesc0.len |= OWNED_BY_NIC;11811177 }1182117811831183- writew(vptr->rd_filled & 0xfffc, ®s->RBRDU);11841184- vptr->rd_filled = unusable;11791179+ writew(vptr->rx.filled & 0xfffc, ®s->RBRDU);11801180+ vptr->rx.filled = unusable;11851181}1186118211871183static int velocity_rx_refill(struct velocity_info *vptr)11881184{11891189- int dirty = vptr->rd_dirty, done = 0;11851185+ int dirty = vptr->rx.dirty, done = 0;1190118611911187 do {11921192- struct rx_desc *rd = vptr->rd_ring + dirty;11881188+ struct rx_desc *rd = vptr->rx.ring + dirty;1193118911941190 /* Fine for an all zero Rx desc at init time as well */11951191 if (rd->rdesc0.len & OWNED_BY_NIC)11961192 break;1197119311981198- if (!vptr->rd_info[dirty].skb) {11941194+ if (!vptr->rx.info[dirty].skb) {11991195 if (velocity_alloc_rx_buf(vptr, dirty) < 0)12001196 break;12011197 }12021198 done++;12031199 dirty = (dirty < vptr->options.numrx - 1) ? dirty + 1 : 0;12041204- } while (dirty != vptr->rd_curr);12001200+ } while (dirty != vptr->rx.curr);1205120112061202 if (done) {12071207- vptr->rd_dirty = dirty;12081208- vptr->rd_filled += done;12031203+ vptr->rx.dirty = dirty;12041204+ vptr->rx.filled += done;12091205 }1210120612111207 return done;···1213120912141210static void velocity_set_rxbufsize(struct velocity_info *vptr, int mtu)12151211{12161216- vptr->rx_buf_sz = (mtu <= ETH_DATA_LEN) ? PKT_BUF_SZ : mtu + 32;12121212+ vptr->rx.buf_sz = (mtu <= ETH_DATA_LEN) ? PKT_BUF_SZ : mtu + 32;12171213}1218121412191215/**···12281224{12291225 int ret = -ENOMEM;1230122612311231- vptr->rd_info = kcalloc(vptr->options.numrx,12271227+ vptr->rx.info = kcalloc(vptr->options.numrx,12321228 sizeof(struct velocity_rd_info), GFP_KERNEL);12331233- if (!vptr->rd_info)12291229+ if (!vptr->rx.info)12341230 goto out;1235123112361236- vptr->rd_filled = vptr->rd_dirty = vptr->rd_curr = 0;12321232+ velocity_init_rx_ring_indexes(vptr);1237123312381234 if (velocity_rx_refill(vptr) != vptr->options.numrx) {12391235 VELOCITY_PRT(MSG_LEVEL_ERR, KERN_ERR···12591255{12601256 int i;1261125712621262- if (vptr->rd_info == NULL)12581258+ if (vptr->rx.info == NULL)12631259 return;1264126012651261 for (i = 0; i < vptr->options.numrx; i++) {12661266- struct velocity_rd_info *rd_info = &(vptr->rd_info[i]);12671267- struct rx_desc *rd = vptr->rd_ring + i;12621262+ struct velocity_rd_info *rd_info = &(vptr->rx.info[i]);12631263+ struct rx_desc *rd = vptr->rx.ring + i;1268126412691265 memset(rd, 0, sizeof(*rd));1270126612711267 if (!rd_info->skb)12721268 continue;12731273- pci_unmap_single(vptr->pdev, rd_info->skb_dma, vptr->rx_buf_sz,12691269+ pci_unmap_single(vptr->pdev, rd_info->skb_dma, vptr->rx.buf_sz,12741270 PCI_DMA_FROMDEVICE);12751271 rd_info->skb_dma = (dma_addr_t) NULL;12761272···12781274 rd_info->skb = NULL;12791275 }1280127612811281- kfree(vptr->rd_info);12821282- vptr->rd_info = NULL;12771277+ kfree(vptr->rx.info);12781278+ vptr->rx.info = NULL;12831279}1284128012851281/**···12971293 unsigned int j;1298129412991295 /* Init the TD ring entries */13001300- for (j = 0; j < vptr->num_txq; j++) {13011301- curr = vptr->td_pool_dma[j];12961296+ for (j = 0; j < vptr->tx.numq; j++) {12971297+ curr = vptr->tx.pool_dma[j];1302129813031303- vptr->td_infos[j] = kcalloc(vptr->options.numtx,12991299+ vptr->tx.infos[j] = kcalloc(vptr->options.numtx,13041300 sizeof(struct velocity_td_info),13051301 GFP_KERNEL);13061306- if (!vptr->td_infos[j]) {13021302+ if (!vptr->tx.infos[j]) {13071303 while(--j >= 0)13081308- kfree(vptr->td_infos[j]);13041304+ kfree(vptr->tx.infos[j]);13091305 return -ENOMEM;13101306 }1311130713121312- vptr->td_tail[j] = vptr->td_curr[j] = vptr->td_used[j] = 0;13081308+ vptr->tx.tail[j] = vptr->tx.curr[j] = vptr->tx.used[j] = 0;13131309 }13141310 return 0;13151311}···13211317static void velocity_free_td_ring_entry(struct velocity_info *vptr,13221318 int q, int n)13231319{13241324- struct velocity_td_info * td_info = &(vptr->td_infos[q][n]);13201320+ struct velocity_td_info * td_info = &(vptr->tx.infos[q][n]);13251321 int i;1326132213271323 if (td_info == NULL)···13531349{13541350 int i, j;1355135113561356- for (j = 0; j < vptr->num_txq; j++) {13571357- if (vptr->td_infos[j] == NULL)13521352+ for (j = 0; j < vptr->tx.numq; j++) {13531353+ if (vptr->tx.infos[j] == NULL)13581354 continue;13591355 for (i = 0; i < vptr->options.numtx; i++) {13601356 velocity_free_td_ring_entry(vptr, j, i);1361135713621358 }13631363- kfree(vptr->td_infos[j]);13641364- vptr->td_infos[j] = NULL;13591359+ kfree(vptr->tx.infos[j]);13601360+ vptr->tx.infos[j] = NULL;13651361 }13661362}13671363···13781374static int velocity_rx_srv(struct velocity_info *vptr, int status)13791375{13801376 struct net_device_stats *stats = &vptr->stats;13811381- int rd_curr = vptr->rd_curr;13771377+ int rd_curr = vptr->rx.curr;13821378 int works = 0;1383137913841380 do {13851385- struct rx_desc *rd = vptr->rd_ring + rd_curr;13811381+ struct rx_desc *rd = vptr->rx.ring + rd_curr;1386138213871387- if (!vptr->rd_info[rd_curr].skb)13831383+ if (!vptr->rx.info[rd_curr].skb)13881384 break;1389138513901386 if (rd->rdesc0.len & OWNED_BY_NIC)···14161412 rd_curr = 0;14171413 } while (++works <= 15);1418141414191419- vptr->rd_curr = rd_curr;14151415+ vptr->rx.curr = rd_curr;1420141614211417 if ((works > 0) && (velocity_rx_refill(vptr) > 0))14221418 velocity_give_many_rx_descs(vptr);···15141510{15151511 void (*pci_action)(struct pci_dev *, dma_addr_t, size_t, int);15161512 struct net_device_stats *stats = &vptr->stats;15171517- struct velocity_rd_info *rd_info = &(vptr->rd_info[idx]);15181518- struct rx_desc *rd = &(vptr->rd_ring[idx]);15131513+ struct velocity_rd_info *rd_info = &(vptr->rx.info[idx]);15141514+ struct rx_desc *rd = &(vptr->rx.ring[idx]);15191515 int pkt_len = le16_to_cpu(rd->rdesc0.len) & 0x3fff;15201516 struct sk_buff *skb;15211517···15311527 skb = rd_info->skb;1532152815331529 pci_dma_sync_single_for_cpu(vptr->pdev, rd_info->skb_dma,15341534- vptr->rx_buf_sz, PCI_DMA_FROMDEVICE);15301530+ vptr->rx.buf_sz, PCI_DMA_FROMDEVICE);1535153115361532 /*15371533 * Drop frame not meeting IEEE 802.3···15541550 rd_info->skb = NULL;15551551 }1556155215571557- pci_action(vptr->pdev, rd_info->skb_dma, vptr->rx_buf_sz,15531553+ pci_action(vptr->pdev, rd_info->skb_dma, vptr->rx.buf_sz,15581554 PCI_DMA_FROMDEVICE);1559155515601556 skb_put(skb, pkt_len - 4);···1584158015851581static int velocity_alloc_rx_buf(struct velocity_info *vptr, int idx)15861582{15871587- struct rx_desc *rd = &(vptr->rd_ring[idx]);15881588- struct velocity_rd_info *rd_info = &(vptr->rd_info[idx]);15831583+ struct rx_desc *rd = &(vptr->rx.ring[idx]);15841584+ struct velocity_rd_info *rd_info = &(vptr->rx.info[idx]);1589158515901590- rd_info->skb = netdev_alloc_skb(vptr->dev, vptr->rx_buf_sz + 64);15861586+ rd_info->skb = dev_alloc_skb(vptr->rx.buf_sz + 64);15911587 if (rd_info->skb == NULL)15921588 return -ENOMEM;15931589···15961592 * 64byte alignment.15971593 */15981594 skb_reserve(rd_info->skb, (unsigned long) rd_info->skb->data & 63);15991599- rd_info->skb_dma = pci_map_single(vptr->pdev, rd_info->skb->data, vptr->rx_buf_sz, PCI_DMA_FROMDEVICE);15951595+ rd_info->skb_dma = pci_map_single(vptr->pdev, rd_info->skb->data,15961596+ vptr->rx.buf_sz, PCI_DMA_FROMDEVICE);1600159716011598 /*16021599 * Fill in the descriptor to match16031603- */16001600+ */1604160116051602 *((u32 *) & (rd->rdesc0)) = 0;16061606- rd->size = cpu_to_le16(vptr->rx_buf_sz) | RX_INTEN;16031603+ rd->size = cpu_to_le16(vptr->rx.buf_sz) | RX_INTEN;16071604 rd->pa_low = cpu_to_le32(rd_info->skb_dma);16081605 rd->pa_high = 0;16091606 return 0;···16301625 struct velocity_td_info *tdinfo;16311626 struct net_device_stats *stats = &vptr->stats;1632162716331633- for (qnum = 0; qnum < vptr->num_txq; qnum++) {16341634- for (idx = vptr->td_tail[qnum]; vptr->td_used[qnum] > 0;16281628+ for (qnum = 0; qnum < vptr->tx.numq; qnum++) {16291629+ for (idx = vptr->tx.tail[qnum]; vptr->tx.used[qnum] > 0;16351630 idx = (idx + 1) % vptr->options.numtx) {1636163116371632 /*16381633 * Get Tx Descriptor16391634 */16401640- td = &(vptr->td_rings[qnum][idx]);16411641- tdinfo = &(vptr->td_infos[qnum][idx]);16351635+ td = &(vptr->tx.rings[qnum][idx]);16361636+ tdinfo = &(vptr->tx.infos[qnum][idx]);1642163716431638 if (td->tdesc0.len & OWNED_BY_NIC)16441639 break;···16621657 stats->tx_bytes += tdinfo->skb->len;16631658 }16641659 velocity_free_tx_buf(vptr, tdinfo);16651665- vptr->td_used[qnum]--;16601660+ vptr->tx.used[qnum]--;16661661 }16671667- vptr->td_tail[qnum] = idx;16621662+ vptr->tx.tail[qnum] = idx;1668166316691664 if (AVAIL_TD(vptr, qnum) < 1) {16701665 full = 1;···18511846 tdinfo->skb = NULL;18521847}1853184818491849+static int velocity_init_rings(struct velocity_info *vptr, int mtu)18501850+{18511851+ int ret;18521852+18531853+ velocity_set_rxbufsize(vptr, mtu);18541854+18551855+ ret = velocity_init_dma_rings(vptr);18561856+ if (ret < 0)18571857+ goto out;18581858+18591859+ ret = velocity_init_rd_ring(vptr);18601860+ if (ret < 0)18611861+ goto err_free_dma_rings_0;18621862+18631863+ ret = velocity_init_td_ring(vptr);18641864+ if (ret < 0)18651865+ goto err_free_rd_ring_1;18661866+out:18671867+ return ret;18681868+18691869+err_free_rd_ring_1:18701870+ velocity_free_rd_ring(vptr);18711871+err_free_dma_rings_0:18721872+ velocity_free_dma_rings(vptr);18731873+ goto out;18741874+}18751875+18761876+static void velocity_free_rings(struct velocity_info *vptr)18771877+{18781878+ velocity_free_td_ring(vptr);18791879+ velocity_free_rd_ring(vptr);18801880+ velocity_free_dma_rings(vptr);18811881+}18821882+18541883/**18551884 * velocity_open - interface activation callback18561885 * @dev: network layer device to open···19011862 struct velocity_info *vptr = netdev_priv(dev);19021863 int ret;1903186419041904- velocity_set_rxbufsize(vptr, dev->mtu);19051905-19061906- ret = velocity_init_rings(vptr);18651865+ ret = velocity_init_rings(vptr, dev->mtu);19071866 if (ret < 0)19081867 goto out;19091909-19101910- ret = velocity_init_rd_ring(vptr);19111911- if (ret < 0)19121912- goto err_free_desc_rings;19131913-19141914- ret = velocity_init_td_ring(vptr);19151915- if (ret < 0)19161916- goto err_free_rd_ring;1917186819181869 /* Ensure chip is running */19191870 pci_set_power_state(vptr->pdev, PCI_D0);···19171888 if (ret < 0) {19181889 /* Power down the chip */19191890 pci_set_power_state(vptr->pdev, PCI_D3hot);19201920- goto err_free_td_ring;18911891+ velocity_free_rings(vptr);18921892+ goto out;19211893 }1922189419231895 mac_enable_int(vptr->mac_regs);···19261896 vptr->flags |= VELOCITY_FLAGS_OPENED;19271897out:19281898 return ret;19291929-19301930-err_free_td_ring:19311931- velocity_free_td_ring(vptr);19321932-err_free_rd_ring:19331933- velocity_free_rd_ring(vptr);19341934-err_free_desc_rings:19351935- velocity_free_rings(vptr);19361936- goto out;19371899}1938190019391901/**···19411919static int velocity_change_mtu(struct net_device *dev, int new_mtu)19421920{19431921 struct velocity_info *vptr = netdev_priv(dev);19441944- unsigned long flags;19451945- int oldmtu = dev->mtu;19461922 int ret = 0;1947192319481924 if ((new_mtu < VELOCITY_MIN_MTU) || new_mtu > (VELOCITY_MAX_MTU)) {19491925 VELOCITY_PRT(MSG_LEVEL_ERR, KERN_NOTICE "%s: Invalid MTU.\n",19501926 vptr->dev->name);19511951- return -EINVAL;19271927+ ret = -EINVAL;19281928+ goto out_0;19521929 }1953193019541931 if (!netif_running(dev)) {19551932 dev->mtu = new_mtu;19561956- return 0;19331933+ goto out_0;19571934 }1958193519591959- if (new_mtu != oldmtu) {19361936+ if (dev->mtu != new_mtu) {19371937+ struct velocity_info *tmp_vptr;19381938+ unsigned long flags;19391939+ struct rx_info rx;19401940+ struct tx_info tx;19411941+19421942+ tmp_vptr = kzalloc(sizeof(*tmp_vptr), GFP_KERNEL);19431943+ if (!tmp_vptr) {19441944+ ret = -ENOMEM;19451945+ goto out_0;19461946+ }19471947+19481948+ tmp_vptr->dev = dev;19491949+ tmp_vptr->pdev = vptr->pdev;19501950+ tmp_vptr->options = vptr->options;19511951+ tmp_vptr->tx.numq = vptr->tx.numq;19521952+19531953+ ret = velocity_init_rings(tmp_vptr, new_mtu);19541954+ if (ret < 0)19551955+ goto out_free_tmp_vptr_1;19561956+19601957 spin_lock_irqsave(&vptr->lock, flags);1961195819621959 netif_stop_queue(dev);19631960 velocity_shutdown(vptr);1964196119651965- velocity_free_td_ring(vptr);19661966- velocity_free_rd_ring(vptr);19621962+ rx = vptr->rx;19631963+ tx = vptr->tx;19641964+19651965+ vptr->rx = tmp_vptr->rx;19661966+ vptr->tx = tmp_vptr->tx;19671967+19681968+ tmp_vptr->rx = rx;19691969+ tmp_vptr->tx = tx;1967197019681971 dev->mtu = new_mtu;1969197219701970- velocity_set_rxbufsize(vptr, new_mtu);19711971-19721972- ret = velocity_init_rd_ring(vptr);19731973- if (ret < 0)19741974- goto out_unlock;19751975-19761976- ret = velocity_init_td_ring(vptr);19771977- if (ret < 0)19781978- goto out_unlock;19731973+ velocity_give_many_rx_descs(vptr);1979197419801975 velocity_init_registers(vptr, VELOCITY_INIT_COLD);1981197619821977 mac_enable_int(vptr->mac_regs);19831978 netif_start_queue(dev);19841984-out_unlock:19851985- spin_unlock_irqrestore(&vptr->lock, flags);19861986- }1987197919801980+ spin_unlock_irqrestore(&vptr->lock, flags);19811981+19821982+ velocity_free_rings(tmp_vptr);19831983+19841984+out_free_tmp_vptr_1:19851985+ kfree(tmp_vptr);19861986+ }19871987+out_0:19881988 return ret;19891989}19901990···20522008 /* Power down the chip */20532009 pci_set_power_state(vptr->pdev, PCI_D3hot);2054201020552055- /* Free the resources */20562056- velocity_free_td_ring(vptr);20572057- velocity_free_rd_ring(vptr);20582011 velocity_free_rings(vptr);2059201220602013 vptr->flags &= (~VELOCITY_FLAGS_OPENED);···2097205620982057 spin_lock_irqsave(&vptr->lock, flags);2099205821002100- index = vptr->td_curr[qnum];21012101- td_ptr = &(vptr->td_rings[qnum][index]);21022102- tdinfo = &(vptr->td_infos[qnum][index]);20592059+ index = vptr->tx.curr[qnum];20602060+ td_ptr = &(vptr->tx.rings[qnum][index]);20612061+ tdinfo = &(vptr->tx.infos[qnum][index]);2103206221042063 td_ptr->tdesc1.TCR = TCR0_TIC;21052064 td_ptr->td_buf[0].size &= ~TD_QUEUE;···21122071 skb_copy_from_linear_data(skb, tdinfo->buf, skb->len);21132072 tdinfo->skb_dma[0] = tdinfo->buf_dma;21142073 td_ptr->tdesc0.len = len;21152115- td_ptr->td_buf[0].pa_low = cpu_to_le32(tdinfo->skb_dma[0]);21162116- td_ptr->td_buf[0].pa_high = 0;21172117- td_ptr->td_buf[0].size = len; /* queue is 0 anyway */20742074+ td_ptr->tx.buf[0].pa_low = cpu_to_le32(tdinfo->skb_dma[0]);20752075+ td_ptr->tx.buf[0].pa_high = 0;20762076+ td_ptr->tx.buf[0].size = len; /* queue is 0 anyway */21182077 tdinfo->nskb_dma = 1;21192078 } else {21202079 int i = 0;···21252084 td_ptr->tdesc0.len = len;2126208521272086 /* FIXME: support 48bit DMA later */21282128- td_ptr->td_buf[i].pa_low = cpu_to_le32(tdinfo->skb_dma);21292129- td_ptr->td_buf[i].pa_high = 0;21302130- td_ptr->td_buf[i].size = cpu_to_le16(skb_headlen(skb));20872087+ td_ptr->tx.buf[i].pa_low = cpu_to_le32(tdinfo->skb_dma);20882088+ td_ptr->tx.buf[i].pa_high = 0;20892089+ td_ptr->tx.buf[i].size = cpu_to_le16(skb_headlen(skb));2131209021322091 for (i = 0; i < nfrags; i++) {21332092 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];···2135209421362095 tdinfo->skb_dma[i + 1] = pci_map_single(vptr->pdev, addr, frag->size, PCI_DMA_TODEVICE);2137209621382138- td_ptr->td_buf[i + 1].pa_low = cpu_to_le32(tdinfo->skb_dma[i + 1]);21392139- td_ptr->td_buf[i + 1].pa_high = 0;21402140- td_ptr->td_buf[i + 1].size = cpu_to_le16(frag->size);20972097+ td_ptr->tx.buf[i + 1].pa_low = cpu_to_le32(tdinfo->skb_dma[i + 1]);20982098+ td_ptr->tx.buf[i + 1].pa_high = 0;20992099+ td_ptr->tx.buf[i + 1].size = cpu_to_le16(frag->size);21412100 }21422101 tdinfo->nskb_dma = i - 1;21432102 }···21832142 if (prev < 0)21842143 prev = vptr->options.numtx - 1;21852144 td_ptr->tdesc0.len |= OWNED_BY_NIC;21862186- vptr->td_used[qnum]++;21872187- vptr->td_curr[qnum] = (index + 1) % vptr->options.numtx;21452145+ vptr->tx.used[qnum]++;21462146+ vptr->tx.curr[qnum] = (index + 1) % vptr->options.numtx;2188214721892148 if (AVAIL_TD(vptr, qnum) < 1)21902149 netif_stop_queue(dev);2191215021922192- td_ptr = &(vptr->td_rings[qnum][prev]);21512151+ td_ptr = &(vptr->tx.rings[qnum][prev]);21932152 td_ptr->td_buf[0].size |= TD_QUEUE;21942153 mac_tx_queue_wake(vptr->mac_regs, qnum);21952154 }···3446340534473406 velocity_tx_srv(vptr, 0);3448340734493449- for (i = 0; i < vptr->num_txq; i++) {34503450- if (vptr->td_used[i]) {34083408+ for (i = 0; i < vptr->tx.numq; i++) {34093409+ if (vptr->tx.used[i]) {34513410 mac_tx_queue_wake(vptr->mac_regs, i);34523411 }34533412 }
+24-20
drivers/net/via-velocity.h
···14941494 u32 flags;14951495};1496149614971497+#define AVAIL_TD(p,q) ((p)->options.numtx-((p)->tx.used[(q)]))14981498+14991499+#define GET_RD_BY_IDX(vptr, idx) (vptr->rd_ring[idx])15001500+14971501struct velocity_info {14981502 struct list_head list;1499150315001504 struct pci_dev *pdev;15011505 struct net_device *dev;15021506 struct net_device_stats stats;15031503-15041504- dma_addr_t rd_pool_dma;15051505- dma_addr_t td_pool_dma[TX_QUEUE_NO];1506150715071508 struct vlan_group *vlgrp;15081509 u8 ip_addr[4];···15131512 unsigned long memaddr;15141513 unsigned long ioaddr;1515151415161516- u8 rev_id;15151515+ struct tx_info {15161516+ int numq;1517151715181518-#define AVAIL_TD(p,q) ((p)->options.numtx-((p)->td_used[(q)]))15181518+ /* FIXME: the locality of the data seems rather poor. */15191519+ int used[TX_QUEUE_NO];15201520+ int curr[TX_QUEUE_NO];15211521+ int tail[TX_QUEUE_NO];15221522+ struct tx_desc *rings[TX_QUEUE_NO];15231523+ struct velocity_td_info *infos[TX_QUEUE_NO];15241524+ dma_addr_t pool_dma[TX_QUEUE_NO];15251525+ } tx;1519152615201520- int num_txq;15271527+ struct rx_info {15281528+ int buf_sz;1521152915221522- volatile int td_used[TX_QUEUE_NO];15231523- int td_curr[TX_QUEUE_NO];15241524- int td_tail[TX_QUEUE_NO];15251525- struct tx_desc *td_rings[TX_QUEUE_NO];15261526- struct velocity_td_info *td_infos[TX_QUEUE_NO];15301530+ int dirty;15311531+ int curr;15321532+ u32 filled;15331533+ struct rx_desc *ring;15341534+ struct velocity_rd_info *info; /* It's an array */15351535+ dma_addr_t pool_dma;15361536+ } rx;1527153715281528- int rd_curr;15291529- int rd_dirty;15301530- u32 rd_filled;15311531- struct rx_desc *rd_ring;15321532- struct velocity_rd_info *rd_info; /* It's an array */15331533-15341534-#define GET_RD_BY_IDX(vptr, idx) (vptr->rd_ring[idx])15351538 u32 mib_counter[MAX_HW_MIB_COUNTER];15361539 struct velocity_opt options;15371540···1543153815441539 u32 flags;1545154015461546- int rx_buf_sz;15471541 u32 mii_status;15481542 u32 phy_id;15491543 int multicast_limit;···15581554 struct velocity_context context;1559155515601556 u32 ticks;15611561- u32 rx_bytes;1562155715581558+ u8 rev_id;15631559};1564156015651561/**
+6-9
drivers/net/wan/Kconfig
···2525# There is no way to detect a comtrol sv11 - force it modular for now.2626config HOSTESS_SV112727 tristate "Comtrol Hostess SV-11 support"2828- depends on ISA && m && ISA_DMA_API && INET2828+ depends on ISA && m && ISA_DMA_API && INET && HDLC2929 help3030 Driver for Comtrol Hostess SV-11 network card which3131 operates on low speed synchronous serial links at up to···3737# The COSA/SRP driver has not been tested as non-modular yet.3838config COSA3939 tristate "COSA/SRP sync serial boards support"4040- depends on ISA && m && ISA_DMA_API4040+ depends on ISA && m && ISA_DMA_API && HDLC4141 ---help---4242 Driver for COSA and SRP synchronous serial boards.4343···6161#6262config LANMEDIA6363 tristate "LanMedia Corp. SSI/V.35, T1/E1, HSSI, T3 boards"6464- depends on PCI && VIRT_TO_BUS6464+ depends on PCI && VIRT_TO_BUS && HDLC6565 ---help---6666 Driver for the following Lan Media family of serial boards:6767···7878 - LMC 5245 board connects directly to a T3 circuit saving the7979 additional external hardware.80808181- To change setting such as syncPPP vs Cisco HDLC or clock source you8282- will need lmcctl. It is available at <ftp://ftp.lanmedia.com/>8383- (broken link).8181+ To change setting such as clock source you will need lmcctl.8282+ It is available at <ftp://ftp.lanmedia.com/> (broken link).84838584 To compile this driver as a module, choose M here: the8685 module will be called lmc.···8788# There is no way to detect a Sealevel board. Force it modular8889config SEALEVEL_40218990 tristate "Sealevel Systems 4021 support"9090- depends on ISA && m && ISA_DMA_API && INET9191+ depends on ISA && m && ISA_DMA_API && INET && HDLC9192 help9293 This is a driver for the Sealevel Systems ACB 56 serial I/O adapter.9394···152153 depends on HDLC153154 help154155 Generic HDLC driver supporting PPP over WAN connections.155155-156156- It will be replaced by new PPP implementation in Linux 2.6.26.157156158157 If unsure, say N.159158
···4747/* Default parameters for the link4848 */4949#define FST_TX_QUEUE_LEN 100 /* At 8Mbps a longer queue length is5050- * useful, the syncppp module forces5151- * this down assuming a slower line I5252- * guess.5353- */5050+ * useful */5451#define FST_TXQ_DEPTH 16 /* This one is for the buffering5552 * of frames on the way down to the card5653 * so that we can keep the card busy
-6
drivers/net/wan/farsync.h
···545455555656/* Ioctl call command values5757- *5858- * The first three private ioctls are used by the sync-PPP module,5959- * allowing a little room for expansion we start our numbering at 10.6057 */6158#define FSTWRITE (SIOCDEVPRIVATE+10)6259#define FSTCPURESET (SIOCDEVPRIVATE+11)···199202#define J1 7200203201204/* "proto" */202202-#define FST_HDLC 1 /* Cisco compatible HDLC */203203-#define FST_PPP 2 /* Sync PPP */204204-#define FST_MONITOR 3 /* Monitor only (raw packet reception) */205205#define FST_RAW 4 /* Two way raw packets */206206#define FST_GEN_HDLC 5 /* Using "Generic HDLC" module */207207
+15-16
drivers/net/wan/hdlc.c
···2222 * - proto->start() and stop() are called with spin_lock_irq held.2323 */24242525-#include <linux/module.h>2626-#include <linux/kernel.h>2727-#include <linux/slab.h>2828-#include <linux/poll.h>2925#include <linux/errno.h>3030-#include <linux/if_arp.h>3131-#include <linux/init.h>3232-#include <linux/skbuff.h>3333-#include <linux/pkt_sched.h>3434-#include <linux/inetdevice.h>3535-#include <linux/lapb.h>3636-#include <linux/rtnetlink.h>3737-#include <linux/notifier.h>3826#include <linux/hdlc.h>2727+#include <linux/if_arp.h>2828+#include <linux/inetdevice.h>2929+#include <linux/init.h>3030+#include <linux/kernel.h>3131+#include <linux/module.h>3232+#include <linux/notifier.h>3333+#include <linux/pkt_sched.h>3434+#include <linux/poll.h>3535+#include <linux/rtnetlink.h>3636+#include <linux/skbuff.h>3737+#include <linux/slab.h>3938#include <net/net_namespace.h>40394140···108109109110 if (dev->get_stats != hdlc_get_stats)110111 return NOTIFY_DONE; /* not an HDLC device */111111-112112+112113 if (event != NETDEV_CHANGE)113114 return NOTIFY_DONE; /* Only interrested in carrier changes */114115···356357357358358359static struct notifier_block hdlc_notifier = {359359- .notifier_call = hdlc_device_event,360360+ .notifier_call = hdlc_device_event,360361};361362362363···366367367368 printk(KERN_INFO "%s\n", version);368369 if ((result = register_netdevice_notifier(&hdlc_notifier)) != 0)369369- return result;370370- dev_add_pack(&hdlc_packet_type);370370+ return result;371371+ dev_add_pack(&hdlc_packet_type);371372 return 0;372373}373374
+17-18
drivers/net/wan/hdlc_cisco.c
···99 * as published by the Free Software Foundation.1010 */11111212-#include <linux/module.h>1313-#include <linux/kernel.h>1414-#include <linux/slab.h>1515-#include <linux/poll.h>1612#include <linux/errno.h>1717-#include <linux/if_arp.h>1818-#include <linux/init.h>1919-#include <linux/skbuff.h>2020-#include <linux/pkt_sched.h>2121-#include <linux/inetdevice.h>2222-#include <linux/lapb.h>2323-#include <linux/rtnetlink.h>2413#include <linux/hdlc.h>1414+#include <linux/if_arp.h>1515+#include <linux/inetdevice.h>1616+#include <linux/init.h>1717+#include <linux/kernel.h>1818+#include <linux/module.h>1919+#include <linux/pkt_sched.h>2020+#include <linux/poll.h>2121+#include <linux/rtnetlink.h>2222+#include <linux/skbuff.h>2323+#include <linux/slab.h>25242625#undef DEBUG_HARD_HEADER2726···6768static int cisco_ioctl(struct net_device *dev, struct ifreq *ifr);686969707070-static inline struct cisco_state * state(hdlc_device *hdlc)7171+static inline struct cisco_state* state(hdlc_device *hdlc)7172{7272- return(struct cisco_state *)(hdlc->state);7373+ return (struct cisco_state *)hdlc->state;7374}74757576···171172 data->address != CISCO_UNICAST)172173 goto rx_error;173174174174- switch(ntohs(data->protocol)) {175175+ switch (ntohs(data->protocol)) {175176 case CISCO_SYS_INFO:176177 /* Packet is not needed, drop it. */177178 dev_kfree_skb_any(skb);···335336static const struct header_ops cisco_header_ops = {336337 .create = cisco_hard_header,337338};338338-339339+339340static int cisco_ioctl(struct net_device *dev, struct ifreq *ifr)340341{341342 cisco_proto __user *cisco_s = ifr->ifr_settings.ifs_ifsu.cisco;···358359 return 0;359360360361 case IF_PROTO_CISCO:361361- if(!capable(CAP_NET_ADMIN))362362+ if (!capable(CAP_NET_ADMIN))362363 return -EPERM;363364364364- if(dev->flags & IFF_UP)365365+ if (dev->flags & IFF_UP)365366 return -EBUSY;366367367368 if (copy_from_user(&new_settings, cisco_s, size))···371372 new_settings.timeout < 2)372373 return -EINVAL;373374374374- result=hdlc->attach(dev, ENCODING_NRZ,PARITY_CRC16_PR1_CCITT);375375+ result = hdlc->attach(dev, ENCODING_NRZ,PARITY_CRC16_PR1_CCITT);375376 if (result)376377 return result;377378
···6161/*6262 * IFTYPE defines6363 */6464-#define LMC_PPP 1 /* use sppp interface */6464+#define LMC_PPP 1 /* use generic HDLC interface */6565#define LMC_NET 2 /* use direct net interface */6666#define LMC_RAW 3 /* use direct net interface */6767
+292-376
drivers/net/wan/lmc/lmc_main.c
···11 /*22 * Copyright (c) 1997-2000 LAN Media Corporation (LMC)33 * All rights reserved. www.lanmedia.com44+ * Generic HDLC port Copyright (C) 2008 Krzysztof Halasa <khc@pm.waw.pl>45 *56 * This code is written by:67 * Andrew Stanley-Jones (asj@cban.com)···3736 *3837 */39384040-/* $Id: lmc_main.c,v 1.36 2000/04/11 05:25:25 asj Exp $ */4141-4239#include <linux/kernel.h>4340#include <linux/module.h>4441#include <linux/string.h>···4849#include <linux/interrupt.h>4950#include <linux/pci.h>5051#include <linux/delay.h>5252+#include <linux/hdlc.h>5153#include <linux/init.h>5254#include <linux/in.h>5355#include <linux/if_arp.h>···5757#include <linux/skbuff.h>5858#include <linux/inet.h>5959#include <linux/bitops.h>6060-6161-#include <net/syncppp.h>6262-6360#include <asm/processor.h> /* Processor type for cache alignment. */6461#include <asm/io.h>6562#include <asm/dma.h>···7578#include "lmc_debug.h"7679#include "lmc_proto.h"77807878-static int lmc_first_load = 0;7979-8081static int LMC_PKT_BUF_SZ = 1542;81828283static struct pci_device_id lmc_pci_tbl[] = {···8691};87928893MODULE_DEVICE_TABLE(pci, lmc_pci_tbl);8989-MODULE_LICENSE("GPL");9494+MODULE_LICENSE("GPL v2");909591969292-static int lmc_start_xmit(struct sk_buff *skb, struct net_device *dev);9397static int lmc_start_xmit(struct sk_buff *skb, struct net_device *dev);9498static int lmc_rx (struct net_device *dev);9599static int lmc_open(struct net_device *dev);···108114 * linux reserves 16 device specific IOCTLs. We call them109115 * LMCIOC* to control various bits of our world.110116 */111111-int lmc_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/117117+int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/112118{113113- lmc_softc_t *sc;119119+ lmc_softc_t *sc = dev_to_sc(dev);114120 lmc_ctl_t ctl;115115- int ret;116116- u_int16_t regVal;121121+ int ret = -EOPNOTSUPP;122122+ u16 regVal;117123 unsigned long flags;118118-119119- struct sppp *sp;120120-121121- ret = -EOPNOTSUPP;122122-123123- sc = dev->priv;124124125125 lmc_trace(dev, "lmc_ioctl in");126126···137149 break;138150139151 case LMCIOCSINFO: /*fold01*/140140- sp = &((struct ppp_device *) dev)->sppp;141152 if (!capable(CAP_NET_ADMIN)) {142153 ret = -EPERM;143154 break;···162175 sc->TxDescriptControlInit &= ~LMC_TDES_ADD_CRC_DISABLE;163176 }164177165165- if (ctl.keepalive_onoff == LMC_CTL_OFF)166166- sp->pp_flags &= ~PP_KEEPALIVE; /* Turn off */167167- else168168- sp->pp_flags |= PP_KEEPALIVE; /* Turn on */169169-170178 ret = 0;171179 break;172180173181 case LMCIOCIFTYPE: /*fold01*/174182 {175175- u_int16_t old_type = sc->if_type;176176- u_int16_t new_type;183183+ u16 old_type = sc->if_type;184184+ u16 new_type;177185178186 if (!capable(CAP_NET_ADMIN)) {179187 ret = -EPERM;180188 break;181189 }182190183183- if (copy_from_user(&new_type, ifr->ifr_data, sizeof(u_int16_t))) {191191+ if (copy_from_user(&new_type, ifr->ifr_data, sizeof(u16))) {184192 ret = -EFAULT;185193 break;186194 }···188206 }189207190208 lmc_proto_close(sc);191191- lmc_proto_detach(sc);192209193210 sc->if_type = new_type;194194-// lmc_proto_init(sc);195211 lmc_proto_attach(sc);196196- lmc_proto_open(sc);197197-198198- ret = 0 ;199199- break ;212212+ ret = lmc_proto_open(sc);213213+ break;200214 }201215202216 case LMCIOCGETXINFO: /*fold01*/···219241220242 break;221243222222- case LMCIOCGETLMCSTATS: /*fold01*/223223- if (sc->lmc_cardtype == LMC_CARDTYPE_T1){224224- lmc_mii_writereg (sc, 0, 17, T1FRAMER_FERR_LSB);225225- sc->stats.framingBitErrorCount +=226226- lmc_mii_readreg (sc, 0, 18) & 0xff;227227- lmc_mii_writereg (sc, 0, 17, T1FRAMER_FERR_MSB);228228- sc->stats.framingBitErrorCount +=229229- (lmc_mii_readreg (sc, 0, 18) & 0xff) << 8;230230- lmc_mii_writereg (sc, 0, 17, T1FRAMER_LCV_LSB);231231- sc->stats.lineCodeViolationCount +=232232- lmc_mii_readreg (sc, 0, 18) & 0xff;233233- lmc_mii_writereg (sc, 0, 17, T1FRAMER_LCV_MSB);234234- sc->stats.lineCodeViolationCount +=235235- (lmc_mii_readreg (sc, 0, 18) & 0xff) << 8;236236- lmc_mii_writereg (sc, 0, 17, T1FRAMER_AERR);237237- regVal = lmc_mii_readreg (sc, 0, 18) & 0xff;244244+ case LMCIOCGETLMCSTATS:245245+ if (sc->lmc_cardtype == LMC_CARDTYPE_T1) {246246+ lmc_mii_writereg(sc, 0, 17, T1FRAMER_FERR_LSB);247247+ sc->extra_stats.framingBitErrorCount +=248248+ lmc_mii_readreg(sc, 0, 18) & 0xff;249249+ lmc_mii_writereg(sc, 0, 17, T1FRAMER_FERR_MSB);250250+ sc->extra_stats.framingBitErrorCount +=251251+ (lmc_mii_readreg(sc, 0, 18) & 0xff) << 8;252252+ lmc_mii_writereg(sc, 0, 17, T1FRAMER_LCV_LSB);253253+ sc->extra_stats.lineCodeViolationCount +=254254+ lmc_mii_readreg(sc, 0, 18) & 0xff;255255+ lmc_mii_writereg(sc, 0, 17, T1FRAMER_LCV_MSB);256256+ sc->extra_stats.lineCodeViolationCount +=257257+ (lmc_mii_readreg(sc, 0, 18) & 0xff) << 8;258258+ lmc_mii_writereg(sc, 0, 17, T1FRAMER_AERR);259259+ regVal = lmc_mii_readreg(sc, 0, 18) & 0xff;238260239239- sc->stats.lossOfFrameCount +=240240- (regVal & T1FRAMER_LOF_MASK) >> 4;241241- sc->stats.changeOfFrameAlignmentCount +=242242- (regVal & T1FRAMER_COFA_MASK) >> 2;243243- sc->stats.severelyErroredFrameCount +=244244- regVal & T1FRAMER_SEF_MASK;245245- }261261+ sc->extra_stats.lossOfFrameCount +=262262+ (regVal & T1FRAMER_LOF_MASK) >> 4;263263+ sc->extra_stats.changeOfFrameAlignmentCount +=264264+ (regVal & T1FRAMER_COFA_MASK) >> 2;265265+ sc->extra_stats.severelyErroredFrameCount +=266266+ regVal & T1FRAMER_SEF_MASK;267267+ }268268+ if (copy_to_user(ifr->ifr_data, &sc->lmc_device->stats,269269+ sizeof(sc->lmc_device->stats)) ||270270+ copy_to_user(ifr->ifr_data + sizeof(sc->lmc_device->stats),271271+ &sc->extra_stats, sizeof(sc->extra_stats)))272272+ ret = -EFAULT;273273+ else274274+ ret = 0;275275+ break;246276247247- if (copy_to_user(ifr->ifr_data, &sc->stats,248248- sizeof (struct lmc_statistics)))249249- ret = -EFAULT;250250- else251251- ret = 0;252252- break;277277+ case LMCIOCCLEARLMCSTATS:278278+ if (!capable(CAP_NET_ADMIN)) {279279+ ret = -EPERM;280280+ break;281281+ }253282254254- case LMCIOCCLEARLMCSTATS: /*fold01*/255255- if (!capable(CAP_NET_ADMIN)){256256- ret = -EPERM;257257- break;258258- }259259-260260- memset (&sc->stats, 0, sizeof (struct lmc_statistics));261261- sc->stats.check = STATCHECK;262262- sc->stats.version_size = (DRIVER_VERSION << 16) +263263- sizeof (struct lmc_statistics);264264- sc->stats.lmc_cardtype = sc->lmc_cardtype;265265- ret = 0;266266- break;283283+ memset(&sc->lmc_device->stats, 0, sizeof(sc->lmc_device->stats));284284+ memset(&sc->extra_stats, 0, sizeof(sc->extra_stats));285285+ sc->extra_stats.check = STATCHECK;286286+ sc->extra_stats.version_size = (DRIVER_VERSION << 16) +287287+ sizeof(sc->lmc_device->stats) + sizeof(sc->extra_stats);288288+ sc->extra_stats.lmc_cardtype = sc->lmc_cardtype;289289+ ret = 0;290290+ break;267291268292 case LMCIOCSETCIRCUIT: /*fold01*/269293 if (!capable(CAP_NET_ADMIN)){···310330 ret = -EFAULT;311331 break;312332 }313313- if (copy_to_user(ifr->ifr_data + sizeof (u32), lmcEventLogBuf, sizeof (lmcEventLogBuf)))333333+ if (copy_to_user(ifr->ifr_data + sizeof(u32), lmcEventLogBuf,334334+ sizeof(lmcEventLogBuf)))314335 ret = -EFAULT;315336 else316337 ret = 0;···622641/* the watchdog process that cruises around */623642static void lmc_watchdog (unsigned long data) /*fold00*/624643{625625- struct net_device *dev = (struct net_device *) data;626626- lmc_softc_t *sc;644644+ struct net_device *dev = (struct net_device *)data;645645+ lmc_softc_t *sc = dev_to_sc(dev);627646 int link_status;628628- u_int32_t ticks;647647+ u32 ticks;629648 unsigned long flags;630630-631631- sc = dev->priv;632649633650 lmc_trace(dev, "lmc_watchdog in");634651···656677 * check for a transmit interrupt timeout657678 * Has the packet xmt vs xmt serviced threshold been exceeded */658679 if (sc->lmc_taint_tx == sc->lastlmc_taint_tx &&659659- sc->stats.tx_packets > sc->lasttx_packets &&660660- sc->tx_TimeoutInd == 0)680680+ sc->lmc_device->stats.tx_packets > sc->lasttx_packets &&681681+ sc->tx_TimeoutInd == 0)661682 {662683663684 /* wait for the watchdog to come around again */664685 sc->tx_TimeoutInd = 1;665686 }666687 else if (sc->lmc_taint_tx == sc->lastlmc_taint_tx &&667667- sc->stats.tx_packets > sc->lasttx_packets &&668668- sc->tx_TimeoutInd)688688+ sc->lmc_device->stats.tx_packets > sc->lasttx_packets &&689689+ sc->tx_TimeoutInd)669690 {670691671692 LMC_EVENT_LOG(LMC_EVENT_XMTINTTMO, LMC_CSR_READ (sc, csr_status), 0);672693673694 sc->tx_TimeoutDisplay = 1;674674- sc->stats.tx_TimeoutCnt++;695695+ sc->extra_stats.tx_TimeoutCnt++;675696676697 /* DEC chip is stuck, hit it with a RESET!!!! */677698 lmc_running_reset (dev);···691712 /* reset the transmit timeout detection flag */692713 sc->tx_TimeoutInd = 0;693714 sc->lastlmc_taint_tx = sc->lmc_taint_tx;694694- sc->lasttx_packets = sc->stats.tx_packets;695695- }696696- else697697- {715715+ sc->lasttx_packets = sc->lmc_device->stats.tx_packets;716716+ } else {698717 sc->tx_TimeoutInd = 0;699718 sc->lastlmc_taint_tx = sc->lmc_taint_tx;700700- sc->lasttx_packets = sc->stats.tx_packets;719719+ sc->lasttx_packets = sc->lmc_device->stats.tx_packets;701720 }702721703722 /* --- end time out check ----------------------------------- */···725748 sc->last_link_status = 1;726749 /* lmc_reset (sc); Again why reset??? */727750728728- /* Inform the world that link protocol is back up. */729751 netif_carrier_on(dev);730730-731731- /* Now we have to tell the syncppp that we had an outage732732- * and that it should deal. Calling sppp_reopen here733733- * should do the trick, but we may have to call sppp_close734734- * when the link goes down, and call sppp_open here.735735- * Subject to more testing.736736- * --bbraun737737- */738738-739739- lmc_proto_reopen(sc);740740-741752 }742753743754 /* Call media specific watchdog functions */···781816782817}783818784784-static void lmc_setup(struct net_device * const dev) /*fold00*/819819+static int lmc_attach(struct net_device *dev, unsigned short encoding,820820+ unsigned short parity)785821{786786- lmc_trace(dev, "lmc_setup in");787787-788788- dev->type = ARPHRD_HDLC;789789- dev->hard_start_xmit = lmc_start_xmit;790790- dev->open = lmc_open;791791- dev->stop = lmc_close;792792- dev->get_stats = lmc_get_stats;793793- dev->do_ioctl = lmc_ioctl;794794- dev->tx_timeout = lmc_driver_timeout;795795- dev->watchdog_timeo = (HZ); /* 1 second */796796-797797- lmc_trace(dev, "lmc_setup out");822822+ if (encoding == ENCODING_NRZ && parity == PARITY_CRC16_PR1_CCITT)823823+ return 0;824824+ return -EINVAL;798825}799799-800826801827static int __devinit lmc_init_one(struct pci_dev *pdev,802828 const struct pci_device_id *ent)803829{804804- struct net_device *dev;805805- lmc_softc_t *sc;806806- u16 subdevice;807807- u_int16_t AdapModelNum;808808- int err = -ENOMEM;809809- static int cards_found;810810-#ifndef GCOM811811- /* We name by type not by vendor */812812- static const char lmcname[] = "hdlc%d";813813-#else814814- /* 815815- * GCOM uses LMC vendor name so that clients can know which card816816- * to attach to.817817- */818818- static const char lmcname[] = "lmc%d";819819-#endif830830+ lmc_softc_t *sc;831831+ struct net_device *dev;832832+ u16 subdevice;833833+ u16 AdapModelNum;834834+ int err;835835+ static int cards_found;836836+837837+ /* lmc_trace(dev, "lmc_init_one in"); */838838+839839+ err = pci_enable_device(pdev);840840+ if (err) {841841+ printk(KERN_ERR "lmc: pci enable failed: %d\n", err);842842+ return err;843843+ }844844+845845+ err = pci_request_regions(pdev, "lmc");846846+ if (err) {847847+ printk(KERN_ERR "lmc: pci_request_region failed\n");848848+ goto err_req_io;849849+ }850850+851851+ /*852852+ * Allocate our own device structure853853+ */854854+ sc = kzalloc(sizeof(lmc_softc_t), GFP_KERNEL);855855+ if (!sc) {856856+ err = -ENOMEM;857857+ goto err_kzalloc;858858+ }859859+860860+ dev = alloc_hdlcdev(sc);861861+ if (!dev) {862862+ printk(KERN_ERR "lmc:alloc_netdev for device failed\n");863863+ goto err_hdlcdev;864864+ }820865821866822822- /*823823- * Allocate our own device structure824824- */825825- dev = alloc_netdev(sizeof(lmc_softc_t), lmcname, lmc_setup);826826- if (!dev) {827827- printk (KERN_ERR "lmc:alloc_netdev for device failed\n");828828- goto out1;829829- }830830-831831- lmc_trace(dev, "lmc_init_one in");867867+ dev->type = ARPHRD_HDLC;868868+ dev_to_hdlc(dev)->xmit = lmc_start_xmit;869869+ dev_to_hdlc(dev)->attach = lmc_attach;870870+ dev->open = lmc_open;871871+ dev->stop = lmc_close;872872+ dev->get_stats = lmc_get_stats;873873+ dev->do_ioctl = lmc_ioctl;874874+ dev->tx_timeout = lmc_driver_timeout;875875+ dev->watchdog_timeo = HZ; /* 1 second */876876+ dev->tx_queue_len = 100;877877+ sc->lmc_device = dev;878878+ sc->name = dev->name;879879+ sc->if_type = LMC_PPP;880880+ sc->check = 0xBEAFCAFE;881881+ dev->base_addr = pci_resource_start(pdev, 0);882882+ dev->irq = pdev->irq;883883+ pci_set_drvdata(pdev, dev);884884+ SET_NETDEV_DEV(dev, &pdev->dev);832885833833- err = pci_enable_device(pdev);834834- if (err) {835835- printk(KERN_ERR "lmc: pci enable failed:%d\n", err);836836- goto out2;837837- }838838-839839- if (pci_request_regions(pdev, "lmc")) {840840- printk(KERN_ERR "lmc: pci_request_region failed\n");841841- err = -EIO;842842- goto out3;843843- }886886+ /*887887+ * This will get the protocol layer ready and do any 1 time init's888888+ * Must have a valid sc and dev structure889889+ */890890+ lmc_proto_attach(sc);844891845845- pci_set_drvdata(pdev, dev);892892+ /* Init the spin lock so can call it latter */846893847847- if(lmc_first_load == 0){848848- printk(KERN_INFO "Lan Media Corporation WAN Driver Version %d.%d.%d\n",849849- DRIVER_MAJOR_VERSION, DRIVER_MINOR_VERSION,DRIVER_SUB_VERSION);850850- lmc_first_load = 1;851851- }852852-853853- sc = dev->priv;854854- sc->lmc_device = dev;855855- sc->name = dev->name;894894+ spin_lock_init(&sc->lmc_lock);895895+ pci_set_master(pdev);856896857857- /* Initialize the sppp layer */858858- /* An ioctl can cause a subsequent detach for raw frame interface */859859- dev->ml_priv = sc;860860- sc->if_type = LMC_PPP;861861- sc->check = 0xBEAFCAFE;862862- dev->base_addr = pci_resource_start(pdev, 0);863863- dev->irq = pdev->irq;897897+ printk(KERN_INFO "%s: detected at %lx, irq %d\n", dev->name,898898+ dev->base_addr, dev->irq);864899865865- SET_NETDEV_DEV(dev, &pdev->dev);866866-867867- /*868868- * This will get the protocol layer ready and do any 1 time init's869869- * Must have a valid sc and dev structure870870- */871871- lmc_proto_init(sc);872872-873873- lmc_proto_attach(sc);874874-875875- /*876876- * Why were we changing this???877877- dev->tx_queue_len = 100;878878- */879879-880880- /* Init the spin lock so can call it latter */881881-882882- spin_lock_init(&sc->lmc_lock);883883- pci_set_master(pdev);884884-885885- printk ("%s: detected at %lx, irq %d\n", dev->name,886886- dev->base_addr, dev->irq);887887-888888- if (register_netdev (dev) != 0) {889889- printk (KERN_ERR "%s: register_netdev failed.\n", dev->name);890890- goto out4;891891- }900900+ err = register_hdlc_device(dev);901901+ if (err) {902902+ printk(KERN_ERR "%s: register_netdev failed.\n", dev->name);903903+ free_netdev(dev);904904+ goto err_hdlcdev;905905+ }892906893907 sc->lmc_cardtype = LMC_CARDTYPE_UNKNOWN;894908 sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;···883939884940 switch (subdevice) {885941 case PCI_DEVICE_ID_LMC_HSSI:886886- printk ("%s: LMC HSSI\n", dev->name);942942+ printk(KERN_INFO "%s: LMC HSSI\n", dev->name);887943 sc->lmc_cardtype = LMC_CARDTYPE_HSSI;888944 sc->lmc_media = &lmc_hssi_media;889945 break;890946 case PCI_DEVICE_ID_LMC_DS3:891891- printk ("%s: LMC DS3\n", dev->name);947947+ printk(KERN_INFO "%s: LMC DS3\n", dev->name);892948 sc->lmc_cardtype = LMC_CARDTYPE_DS3;893949 sc->lmc_media = &lmc_ds3_media;894950 break;895951 case PCI_DEVICE_ID_LMC_SSI:896896- printk ("%s: LMC SSI\n", dev->name);952952+ printk(KERN_INFO "%s: LMC SSI\n", dev->name);897953 sc->lmc_cardtype = LMC_CARDTYPE_SSI;898954 sc->lmc_media = &lmc_ssi_media;899955 break;900956 case PCI_DEVICE_ID_LMC_T1:901901- printk ("%s: LMC T1\n", dev->name);957957+ printk(KERN_INFO "%s: LMC T1\n", dev->name);902958 sc->lmc_cardtype = LMC_CARDTYPE_T1;903959 sc->lmc_media = &lmc_t1_media;904960 break;905961 default:906906- printk (KERN_WARNING "%s: LMC UNKOWN CARD!\n", dev->name);962962+ printk(KERN_WARNING "%s: LMC UNKOWN CARD!\n", dev->name);907963 break;908964 }909965···921977 */922978 AdapModelNum = (lmc_mii_readreg (sc, 0, 3) & 0x3f0) >> 4;923979924924- if ((AdapModelNum == LMC_ADAP_T1925925- && subdevice == PCI_DEVICE_ID_LMC_T1) || /* detect LMC1200 */926926- (AdapModelNum == LMC_ADAP_SSI927927- && subdevice == PCI_DEVICE_ID_LMC_SSI) || /* detect LMC1000 */928928- (AdapModelNum == LMC_ADAP_DS3929929- && subdevice == PCI_DEVICE_ID_LMC_DS3) || /* detect LMC5245 */930930- (AdapModelNum == LMC_ADAP_HSSI931931- && subdevice == PCI_DEVICE_ID_LMC_HSSI))932932- { /* detect LMC5200 */980980+ if ((AdapModelNum != LMC_ADAP_T1 || /* detect LMC1200 */981981+ subdevice != PCI_DEVICE_ID_LMC_T1) &&982982+ (AdapModelNum != LMC_ADAP_SSI || /* detect LMC1000 */983983+ subdevice != PCI_DEVICE_ID_LMC_SSI) &&984984+ (AdapModelNum != LMC_ADAP_DS3 || /* detect LMC5245 */985985+ subdevice != PCI_DEVICE_ID_LMC_DS3) &&986986+ (AdapModelNum != LMC_ADAP_HSSI || /* detect LMC5200 */987987+ subdevice != PCI_DEVICE_ID_LMC_HSSI))988988+ printk(KERN_WARNING "%s: Model number (%d) miscompare for PCI"989989+ " Subsystem ID = 0x%04x\n",990990+ dev->name, AdapModelNum, subdevice);933991934934- }935935- else {936936- printk ("%s: Model number (%d) miscompare for PCI Subsystem ID = 0x%04x\n",937937- dev->name, AdapModelNum, subdevice);938938-// return (NULL);939939- }940992 /*941993 * reset clock942994 */943995 LMC_CSR_WRITE (sc, csr_gp_timer, 0xFFFFFFFFUL);944996945997 sc->board_idx = cards_found++;946946- sc->stats.check = STATCHECK;947947- sc->stats.version_size = (DRIVER_VERSION << 16) +948948- sizeof (struct lmc_statistics);949949- sc->stats.lmc_cardtype = sc->lmc_cardtype;998998+ sc->extra_stats.check = STATCHECK;999999+ sc->extra_stats.version_size = (DRIVER_VERSION << 16) +10001000+ sizeof(sc->lmc_device->stats) + sizeof(sc->extra_stats);10011001+ sc->extra_stats.lmc_cardtype = sc->lmc_cardtype;95010029511003 sc->lmc_ok = 0;9521004 sc->last_link_status = 0;···9501010 lmc_trace(dev, "lmc_init_one out");9511011 return 0;9521012953953- out4:954954- lmc_proto_detach(sc);955955- out3:956956- if (pdev) {957957- pci_release_regions(pdev);958958- pci_set_drvdata(pdev, NULL);959959- }960960- out2:961961- free_netdev(dev);962962- out1:963963- return err;10131013+err_hdlcdev:10141014+ pci_set_drvdata(pdev, NULL);10151015+ kfree(sc);10161016+err_kzalloc:10171017+ pci_release_regions(pdev);10181018+err_req_io:10191019+ pci_disable_device(pdev);10201020+ return err;9641021}96510229661023/*9671024 * Called from pci when removing module.9681025 */969969-static void __devexit lmc_remove_one (struct pci_dev *pdev)10261026+static void __devexit lmc_remove_one(struct pci_dev *pdev)9701027{971971- struct net_device *dev = pci_get_drvdata(pdev);972972-973973- if (dev) {974974- lmc_softc_t *sc = dev->priv;975975-976976- printk("%s: removing...\n", dev->name);977977- lmc_proto_detach(sc);978978- unregister_netdev(dev);979979- free_netdev(dev);980980- pci_release_regions(pdev);981981- pci_disable_device(pdev);982982- pci_set_drvdata(pdev, NULL);983983- }10281028+ struct net_device *dev = pci_get_drvdata(pdev);10291029+10301030+ if (dev) {10311031+ printk(KERN_DEBUG "%s: removing...\n", dev->name);10321032+ unregister_hdlc_device(dev);10331033+ free_netdev(dev);10341034+ pci_release_regions(pdev);10351035+ pci_disable_device(pdev);10361036+ pci_set_drvdata(pdev, NULL);10371037+ }9841038}98510399861040/* After this is called, packets can be sent.9871041 * Does not initialize the addresses9881042 */989989-static int lmc_open (struct net_device *dev) /*fold00*/10431043+static int lmc_open(struct net_device *dev)9901044{991991- lmc_softc_t *sc = dev->priv;10451045+ lmc_softc_t *sc = dev_to_sc(dev);10461046+ int err;99210479931048 lmc_trace(dev, "lmc_open in");99410499951050 lmc_led_on(sc, LMC_DS3_LED0);9961051997997- lmc_dec_reset (sc);998998- lmc_reset (sc);10521052+ lmc_dec_reset(sc);10531053+ lmc_reset(sc);999105410001000- LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ (sc, csr_status), 0);10011001- LMC_EVENT_LOG(LMC_EVENT_RESET2,10021002- lmc_mii_readreg (sc, 0, 16),10031003- lmc_mii_readreg (sc, 0, 17));10041004-10551055+ LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ(sc, csr_status), 0);10561056+ LMC_EVENT_LOG(LMC_EVENT_RESET2, lmc_mii_readreg(sc, 0, 16),10571057+ lmc_mii_readreg(sc, 0, 17));1005105810061059 if (sc->lmc_ok){10071060 lmc_trace(dev, "lmc_open lmc_ok out");···1039110610401107 /* dev->flags |= IFF_UP; */1041110810421042- lmc_proto_open(sc);11091109+ if ((err = lmc_proto_open(sc)) != 0)11101110+ return err;1043111110441112 dev->do_ioctl = lmc_ioctl;104511131046111410471115 netif_start_queue(dev);10481048-10491049- sc->stats.tx_tbusy0++ ;11161116+ sc->extra_stats.tx_tbusy0++;1050111710511118 /*10521119 * select what interrupts we want to get···1098116510991166static void lmc_running_reset (struct net_device *dev) /*fold00*/11001167{11011101-11021102- lmc_softc_t *sc = (lmc_softc_t *) dev->priv;11681168+ lmc_softc_t *sc = dev_to_sc(dev);1103116911041170 lmc_trace(dev, "lmc_runnig_reset in");11051171···11161184 netif_wake_queue(dev);1117118511181186 sc->lmc_txfull = 0;11191119- sc->stats.tx_tbusy0++ ;11871187+ sc->extra_stats.tx_tbusy0++;1120118811211189 sc->lmc_intrmask = TULIP_DEFAULT_INTR_MASK;11221190 LMC_CSR_WRITE (sc, csr_intr, sc->lmc_intrmask);···11321200 * This disables the timer for the watchdog and keepalives,11331201 * and disables the irq for dev.11341202 */11351135-static int lmc_close (struct net_device *dev) /*fold00*/12031203+static int lmc_close(struct net_device *dev)11361204{11371205 /* not calling release_region() as we should */11381138- lmc_softc_t *sc;12061206+ lmc_softc_t *sc = dev_to_sc(dev);1139120711401208 lmc_trace(dev, "lmc_close in");11411141-11421142- sc = dev->priv;12091209+11431210 sc->lmc_ok = 0;11441211 sc->lmc_media->set_link_status (sc, 0);11451212 del_timer (&sc->timer);···11461215 lmc_ifdown (dev);1147121611481217 lmc_trace(dev, "lmc_close out");11491149-12181218+11501219 return 0;11511220}11521221···11541223/* When the interface goes down, this is called */11551224static int lmc_ifdown (struct net_device *dev) /*fold00*/11561225{11571157- lmc_softc_t *sc = dev->priv;12261226+ lmc_softc_t *sc = dev_to_sc(dev);11581227 u32 csr6;11591228 int i;1160122911611230 lmc_trace(dev, "lmc_ifdown in");11621162-12311231+11631232 /* Don't let anything else go on right now */11641233 // dev->start = 0;11651234 netif_stop_queue(dev);11661166- sc->stats.tx_tbusy1++ ;12351235+ sc->extra_stats.tx_tbusy1++;1167123611681237 /* stop interrupts */11691238 /* Clear the interrupt mask */···11751244 csr6 &= ~LMC_DEC_SR; /* Turn off the Receive bit */11761245 LMC_CSR_WRITE (sc, csr_command, csr6);1177124611781178- sc->stats.rx_missed_errors +=11791179- LMC_CSR_READ (sc, csr_missed_frames) & 0xffff;12471247+ sc->lmc_device->stats.rx_missed_errors +=12481248+ LMC_CSR_READ(sc, csr_missed_frames) & 0xffff;1180124911811250 /* release the interrupt */11821251 if(sc->got_irq == 1){···12071276 lmc_led_off (sc, LMC_MII16_LED_ALL);1208127712091278 netif_wake_queue(dev);12101210- sc->stats.tx_tbusy0++ ;12791279+ sc->extra_stats.tx_tbusy0++;1211128012121281 lmc_trace(dev, "lmc_ifdown out");12131282···12201289static irqreturn_t lmc_interrupt (int irq, void *dev_instance) /*fold00*/12211290{12221291 struct net_device *dev = (struct net_device *) dev_instance;12231223- lmc_softc_t *sc;12921292+ lmc_softc_t *sc = dev_to_sc(dev);12241293 u32 csr;12251294 int i;12261295 s32 stat;···1231130012321301 lmc_trace(dev, "lmc_interrupt in");1233130212341234- sc = dev->priv;12351235-12361303 spin_lock(&sc->lmc_lock);1237130412381305 /*···1283135412841355 int n_compl = 0 ;12851356 /* reset the transmit timeout detection flag -baz */12861286- sc->stats.tx_NoCompleteCnt = 0;13571357+ sc->extra_stats.tx_NoCompleteCnt = 0;1287135812881359 badtx = sc->lmc_taint_tx;12891360 i = badtx % LMC_TXDESCS;···13071378 if (sc->lmc_txq[i] == NULL)13081379 continue;1309138013101310- /*13111311- * Check the total error summary to look for any errors13121312- */13131313- if (stat & 0x8000) {13141314- sc->stats.tx_errors++;13151315- if (stat & 0x4104)13161316- sc->stats.tx_aborted_errors++;13171317- if (stat & 0x0C00)13181318- sc->stats.tx_carrier_errors++;13191319- if (stat & 0x0200)13201320- sc->stats.tx_window_errors++;13211321- if (stat & 0x0002)13221322- sc->stats.tx_fifo_errors++;13811381+ /*13821382+ * Check the total error summary to look for any errors13831383+ */13841384+ if (stat & 0x8000) {13851385+ sc->lmc_device->stats.tx_errors++;13861386+ if (stat & 0x4104)13871387+ sc->lmc_device->stats.tx_aborted_errors++;13881388+ if (stat & 0x0C00)13891389+ sc->lmc_device->stats.tx_carrier_errors++;13901390+ if (stat & 0x0200)13911391+ sc->lmc_device->stats.tx_window_errors++;13921392+ if (stat & 0x0002)13931393+ sc->lmc_device->stats.tx_fifo_errors++;13941394+ } else {13951395+ sc->lmc_device->stats.tx_bytes += sc->lmc_txring[i].length & 0x7ff;13961396+13971397+ sc->lmc_device->stats.tx_packets++;13231398 }13241324- else {13251325-13261326- sc->stats.tx_bytes += sc->lmc_txring[i].length & 0x7ff;13271327-13281328- sc->stats.tx_packets++;13291329- }13301330-13991399+13311400 // dev_kfree_skb(sc->lmc_txq[i]);13321401 dev_kfree_skb_irq(sc->lmc_txq[i]);13331402 sc->lmc_txq[i] = NULL;···13421415 LMC_EVENT_LOG(LMC_EVENT_TBUSY0, n_compl, 0);13431416 sc->lmc_txfull = 0;13441417 netif_wake_queue(dev);13451345- sc->stats.tx_tbusy0++ ;14181418+ sc->extra_stats.tx_tbusy0++;134614191347142013481421#ifdef DEBUG13491349- sc->stats.dirtyTx = badtx;13501350- sc->stats.lmc_next_tx = sc->lmc_next_tx;13511351- sc->stats.lmc_txfull = sc->lmc_txfull;14221422+ sc->extra_stats.dirtyTx = badtx;14231423+ sc->extra_stats.lmc_next_tx = sc->lmc_next_tx;14241424+ sc->extra_stats.lmc_txfull = sc->lmc_txfull;13521425#endif13531426 sc->lmc_taint_tx = badtx;13541427···14031476 return IRQ_RETVAL(handled);14041477}1405147814061406-static int lmc_start_xmit (struct sk_buff *skb, struct net_device *dev) /*fold00*/14791479+static int lmc_start_xmit(struct sk_buff *skb, struct net_device *dev)14071480{14081408- lmc_softc_t *sc;14811481+ lmc_softc_t *sc = dev_to_sc(dev);14091482 u32 flag;14101483 int entry;14111484 int ret = 0;14121485 unsigned long flags;1413148614141487 lmc_trace(dev, "lmc_start_xmit in");14151415-14161416- sc = dev->priv;1417148814181489 spin_lock_irqsave(&sc->lmc_lock, flags);14191490···14571532 if (sc->lmc_next_tx - sc->lmc_taint_tx >= LMC_TXDESCS - 1)14581533 { /* ring full, go busy */14591534 sc->lmc_txfull = 1;14601460- netif_stop_queue(dev);14611461- sc->stats.tx_tbusy1++ ;15351535+ netif_stop_queue(dev);15361536+ sc->extra_stats.tx_tbusy1++;14621537 LMC_EVENT_LOG(LMC_EVENT_TBUSY1, entry, 0);14631538 }14641539#endif···14751550 * the watchdog timer handler. -baz14761551 */1477155214781478- sc->stats.tx_NoCompleteCnt++;15531553+ sc->extra_stats.tx_NoCompleteCnt++;14791554 sc->lmc_next_tx++;1480155514811556 /* give ownership to the chip */···14941569}149515701496157114971497-static int lmc_rx (struct net_device *dev) /*fold00*/15721572+static int lmc_rx(struct net_device *dev)14981573{14991499- lmc_softc_t *sc;15741574+ lmc_softc_t *sc = dev_to_sc(dev);15001575 int i;15011576 int rx_work_limit = LMC_RXDESCS;15021577 unsigned int next_rx;···15071582 u16 len;1508158315091584 lmc_trace(dev, "lmc_rx in");15101510-15111511- sc = dev->priv;1512158515131586 lmc_led_on(sc, LMC_DS3_LED3);15141587···15201597 rxIntLoopCnt++; /* debug -baz */15211598 len = ((stat & LMC_RDES_FRAME_LENGTH) >> RDES_FRAME_LENGTH_BIT_NUMBER);15221599 if ((stat & 0x0300) != 0x0300) { /* Check first segment and last segment */15231523- if ((stat & 0x0000ffff) != 0x7fff) {15241524- /* Oversized frame */15251525- sc->stats.rx_length_errors++;15261526- goto skip_packet;15271527- }15281528- }16001600+ if ((stat & 0x0000ffff) != 0x7fff) {16011601+ /* Oversized frame */16021602+ sc->lmc_device->stats.rx_length_errors++;16031603+ goto skip_packet;16041604+ }16051605+ }1529160615301530- if(stat & 0x00000008){ /* Catch a dribbling bit error */15311531- sc->stats.rx_errors++;15321532- sc->stats.rx_frame_errors++;15331533- goto skip_packet;15341534- }15351535-15361536-15371537- if(stat & 0x00000004){ /* Catch a CRC error by the Xilinx */15381538- sc->stats.rx_errors++;15391539- sc->stats.rx_crc_errors++;15401540- goto skip_packet;15411541- }16071607+ if (stat & 0x00000008) { /* Catch a dribbling bit error */16081608+ sc->lmc_device->stats.rx_errors++;16091609+ sc->lmc_device->stats.rx_frame_errors++;16101610+ goto skip_packet;16111611+ }154216121543161315441544- if (len > LMC_PKT_BUF_SZ){15451545- sc->stats.rx_length_errors++;15461546- localLengthErrCnt++;15471547- goto skip_packet;15481548- }16141614+ if (stat & 0x00000004) { /* Catch a CRC error by the Xilinx */16151615+ sc->lmc_device->stats.rx_errors++;16161616+ sc->lmc_device->stats.rx_crc_errors++;16171617+ goto skip_packet;16181618+ }1549161915501550- if (len < sc->lmc_crcSize + 2) {15511551- sc->stats.rx_length_errors++;15521552- sc->stats.rx_SmallPktCnt++;15531553- localLengthErrCnt++;15541554- goto skip_packet;15551555- }16201620+ if (len > LMC_PKT_BUF_SZ) {16211621+ sc->lmc_device->stats.rx_length_errors++;16221622+ localLengthErrCnt++;16231623+ goto skip_packet;16241624+ }16251625+16261626+ if (len < sc->lmc_crcSize + 2) {16271627+ sc->lmc_device->stats.rx_length_errors++;16281628+ sc->extra_stats.rx_SmallPktCnt++;16291629+ localLengthErrCnt++;16301630+ goto skip_packet;16311631+ }1556163215571633 if(stat & 0x00004000){15581634 printk(KERN_WARNING "%s: Receiver descriptor error, receiver out of sync?\n", dev->name);···15781656 }1579165715801658 dev->last_rx = jiffies;15811581- sc->stats.rx_packets++;15821582- sc->stats.rx_bytes += len;16591659+ sc->lmc_device->stats.rx_packets++;16601660+ sc->lmc_device->stats.rx_bytes += len;1583166115841662 LMC_CONSOLE_LOG("recv", skb->data, len);15851663···1601167916021680 skb_put (skb, len);16031681 skb->protocol = lmc_proto_type(sc, skb);16041604- skb->protocol = htons(ETH_P_WAN_PPP);16051682 skb_reset_mac_header(skb);16061683 /* skb_reset_network_header(skb); */16071684 skb->dev = dev;···16251704 * in which care we'll try to allocate the buffer16261705 * again. (once a second)16271706 */16281628- sc->stats.rx_BuffAllocErr++;17071707+ sc->extra_stats.rx_BuffAllocErr++;16291708 LMC_EVENT_LOG(LMC_EVENT_RCVINT, stat, len);16301709 sc->failed_recv_alloc = 1;16311710 goto skip_out_of_mem;···16601739 * descriptors with bogus packets16611740 *16621741 if (localLengthErrCnt > LMC_RXDESCS - 3) {16631663- sc->stats.rx_BadPktSurgeCnt++;16641664- LMC_EVENT_LOG(LMC_EVENT_BADPKTSURGE,16651665- localLengthErrCnt,16661666- sc->stats.rx_BadPktSurgeCnt);17421742+ sc->extra_stats.rx_BadPktSurgeCnt++;17431743+ LMC_EVENT_LOG(LMC_EVENT_BADPKTSURGE, localLengthErrCnt,17441744+ sc->extra_stats.rx_BadPktSurgeCnt);16671745 } */1668174616691747 /* save max count of receive descriptors serviced */16701670- if (rxIntLoopCnt > sc->stats.rxIntLoopCnt) {16711671- sc->stats.rxIntLoopCnt = rxIntLoopCnt; /* debug -baz */16721672- }17481748+ if (rxIntLoopCnt > sc->extra_stats.rxIntLoopCnt)17491749+ sc->extra_stats.rxIntLoopCnt = rxIntLoopCnt; /* debug -baz */1673175016741751#ifdef DEBUG16751752 if (rxIntLoopCnt == 0)···16941775 return 0;16951776}1696177716971697-static struct net_device_stats *lmc_get_stats (struct net_device *dev) /*fold00*/17781778+static struct net_device_stats *lmc_get_stats(struct net_device *dev)16981779{16991699- lmc_softc_t *sc = dev->priv;17801780+ lmc_softc_t *sc = dev_to_sc(dev);17001781 unsigned long flags;1701178217021783 lmc_trace(dev, "lmc_get_stats in");1703178417041704-17051785 spin_lock_irqsave(&sc->lmc_lock, flags);1706178617071707- sc->stats.rx_missed_errors += LMC_CSR_READ (sc, csr_missed_frames) & 0xffff;17871787+ sc->lmc_device->stats.rx_missed_errors += LMC_CSR_READ(sc, csr_missed_frames) & 0xffff;1708178817091789 spin_unlock_irqrestore(&sc->lmc_lock, flags);1710179017111791 lmc_trace(dev, "lmc_get_stats out");1712179217131713- return (struct net_device_stats *) &sc->stats;17931793+ return &sc->lmc_device->stats;17141794}1715179517161796static struct pci_driver lmc_driver = {···18881970 {18891971 if (sc->lmc_txq[i] != NULL){ /* have buffer */18901972 dev_kfree_skb(sc->lmc_txq[i]); /* free it */18911891- sc->stats.tx_dropped++; /* We just dropped a packet */19731973+ sc->lmc_device->stats.tx_dropped++; /* We just dropped a packet */18921974 }18931975 sc->lmc_txq[i] = NULL;18941976 sc->lmc_txring[i].status = 0x00000000;···19001982 lmc_trace(sc->lmc_device, "lmc_softreset out");19011983}1902198419031903-void lmc_gpio_mkinput(lmc_softc_t * const sc, u_int32_t bits) /*fold00*/19851985+void lmc_gpio_mkinput(lmc_softc_t * const sc, u32 bits) /*fold00*/19041986{19051987 lmc_trace(sc->lmc_device, "lmc_gpio_mkinput in");19061988 sc->lmc_gpio_io &= ~bits;···19081990 lmc_trace(sc->lmc_device, "lmc_gpio_mkinput out");19091991}1910199219111911-void lmc_gpio_mkoutput(lmc_softc_t * const sc, u_int32_t bits) /*fold00*/19931993+void lmc_gpio_mkoutput(lmc_softc_t * const sc, u32 bits) /*fold00*/19121994{19131995 lmc_trace(sc->lmc_device, "lmc_gpio_mkoutput in");19141996 sc->lmc_gpio_io |= bits;···19161998 lmc_trace(sc->lmc_device, "lmc_gpio_mkoutput out");19171999}1918200019191919-void lmc_led_on(lmc_softc_t * const sc, u_int32_t led) /*fold00*/20012001+void lmc_led_on(lmc_softc_t * const sc, u32 led) /*fold00*/19202002{19212003 lmc_trace(sc->lmc_device, "lmc_led_on in");19222004 if((~sc->lmc_miireg16) & led){ /* Already on! */···19292011 lmc_trace(sc->lmc_device, "lmc_led_on out");19302012}1931201319321932-void lmc_led_off(lmc_softc_t * const sc, u_int32_t led) /*fold00*/20142014+void lmc_led_off(lmc_softc_t * const sc, u32 led) /*fold00*/19332015{19342016 lmc_trace(sc->lmc_device, "lmc_led_off in");19352017 if(sc->lmc_miireg16 & led){ /* Already set don't do anything */···19792061 */19802062 sc->lmc_media->init(sc);1981206319821982- sc->stats.resetCount++;20642064+ sc->extra_stats.resetCount++;19832065 lmc_trace(sc->lmc_device, "lmc_reset out");19842066}1985206719862068static void lmc_dec_reset(lmc_softc_t * const sc) /*fold00*/19872069{19881988- u_int32_t val;20702070+ u32 val;19892071 lmc_trace(sc->lmc_device, "lmc_dec_reset in");1990207219912073 /*···20692151 lmc_trace(sc->lmc_device, "lmc_initcsrs out");20702152}2071215320722072-static void lmc_driver_timeout(struct net_device *dev) { /*fold00*/20732073- lmc_softc_t *sc;21542154+static void lmc_driver_timeout(struct net_device *dev)21552155+{21562156+ lmc_softc_t *sc = dev_to_sc(dev);20742157 u32 csr6;20752158 unsigned long flags;2076215920772160 lmc_trace(dev, "lmc_driver_timeout in");2078216120792079- sc = dev->priv;20802080-20812162 spin_lock_irqsave(&sc->lmc_lock, flags);2082216320832164 printk("%s: Xmitter busy|\n", dev->name);2084216520852085- sc->stats.tx_tbusy_calls++ ;20862086- if (jiffies - dev->trans_start < TX_TIMEOUT) {20872087- goto bug_out;20882088- }21662166+ sc->extra_stats.tx_tbusy_calls++;21672167+ if (jiffies - dev->trans_start < TX_TIMEOUT)21682168+ goto bug_out;2089216920902170 /*20912171 * Chip seems to have locked up···2094217820952179 LMC_EVENT_LOG(LMC_EVENT_XMTPRCTMO,20962180 LMC_CSR_READ (sc, csr_status),20972097- sc->stats.tx_ProcTimeout);21812181+ sc->extra_stats.tx_ProcTimeout);2098218220992183 lmc_running_reset (dev);21002184···21112195 /* immediate transmit */21122196 LMC_CSR_WRITE (sc, csr_txpoll, 0);2113219721142114- sc->stats.tx_errors++;21152115- sc->stats.tx_ProcTimeout++; /* -baz */21982198+ sc->lmc_device->stats.tx_errors++;21992199+ sc->extra_stats.tx_ProcTimeout++; /* -baz */2116220021172201 dev->trans_start = jiffies;21182202
+27-39
drivers/net/wan/lmc/lmc_media.c
···1616#include <linux/inet.h>1717#include <linux/bitops.h>18181919-#include <net/syncppp.h>2020-2119#include <asm/processor.h> /* Processor type for cache alignment. */2220#include <asm/io.h>2321#include <asm/dma.h>···9395static void lmc_dummy_set2_1 (lmc_softc_t * const, lmc_ctl_t *);94969597static inline void write_av9110_bit (lmc_softc_t *, int);9696-static void write_av9110 (lmc_softc_t *, u_int32_t, u_int32_t, u_int32_t,9797- u_int32_t, u_int32_t);9898+static void write_av9110(lmc_softc_t *, u32, u32, u32, u32, u32);989999100lmc_media_t lmc_ds3_media = {100101 lmc_ds3_init, /* special media init stuff */···424427static int425428lmc_ds3_get_link_status (lmc_softc_t * const sc)426429{427427- u_int16_t link_status, link_status_11;430430+ u16 link_status, link_status_11;428431 int ret = 1;429432430433 lmc_mii_writereg (sc, 0, 17, 7);···446449 (link_status & LMC_FRAMER_REG0_OOFS)){447450 ret = 0;448451 if(sc->last_led_err[3] != 1){449449- u16 r1;452452+ u16 r1;450453 lmc_mii_writereg (sc, 0, 17, 01); /* Turn on Xbit error as our cisco does */451454 r1 = lmc_mii_readreg (sc, 0, 18);452455 r1 &= 0xfe;···459462 else {460463 lmc_led_off(sc, LMC_DS3_LED3); /* turn on red LED */461464 if(sc->last_led_err[3] == 1){462462- u16 r1;465465+ u16 r1;463466 lmc_mii_writereg (sc, 0, 17, 01); /* Turn off Xbit error */464467 r1 = lmc_mii_readreg (sc, 0, 18);465468 r1 |= 0x01;···537540 * SSI methods538541 */539542540540-static void541541-lmc_ssi_init (lmc_softc_t * const sc)543543+static void lmc_ssi_init(lmc_softc_t * const sc)542544{543543- u_int16_t mii17;544544- int cable;545545+ u16 mii17;546546+ int cable;545547546546- sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC1000;548548+ sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC1000;547549548548- mii17 = lmc_mii_readreg (sc, 0, 17);550550+ mii17 = lmc_mii_readreg(sc, 0, 17);549551550550- cable = (mii17 & LMC_MII17_SSI_CABLE_MASK) >> LMC_MII17_SSI_CABLE_SHIFT;551551- sc->ictl.cable_type = cable;552552+ cable = (mii17 & LMC_MII17_SSI_CABLE_MASK) >> LMC_MII17_SSI_CABLE_SHIFT;553553+ sc->ictl.cable_type = cable;552554553553- lmc_gpio_mkoutput (sc, LMC_GEP_SSI_TXCLOCK);555555+ lmc_gpio_mkoutput(sc, LMC_GEP_SSI_TXCLOCK);554556}555557556558static void···677681static int678682lmc_ssi_get_link_status (lmc_softc_t * const sc)679683{680680- u_int16_t link_status;681681- u_int32_t ticks;684684+ u16 link_status;685685+ u32 ticks;682686 int ret = 1;683687 int hw_hdsk = 1;684684-688688+685689 /*686690 * missing CTS? Hmm. If we require CTS on, we may never get the687691 * link to come up, so omit it in this test.···716720 }717721 else if (ticks == 0 ) { /* no clock found ? */718722 ret = 0;719719- if(sc->last_led_err[3] != 1){720720- sc->stats.tx_lossOfClockCnt++;721721- printk(KERN_WARNING "%s: Lost Clock, Link Down\n", sc->name);723723+ if (sc->last_led_err[3] != 1) {724724+ sc->extra_stats.tx_lossOfClockCnt++;725725+ printk(KERN_WARNING "%s: Lost Clock, Link Down\n", sc->name);722726 }723727 sc->last_led_err[3] = 1;724728 lmc_led_on (sc, LMC_MII16_LED3); /* turn ON red LED */···834838 LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);835839}836840837837-static void838838-write_av9110 (lmc_softc_t * sc, u_int32_t n, u_int32_t m, u_int32_t v,839839- u_int32_t x, u_int32_t r)841841+static void write_av9110(lmc_softc_t *sc, u32 n, u32 m, u32 v, u32 x, u32 r)840842{841843 int i;842844···881887 | LMC_GEP_SSI_GENERATOR));882888}883889884884-static void885885-lmc_ssi_watchdog (lmc_softc_t * const sc)890890+static void lmc_ssi_watchdog(lmc_softc_t * const sc)886891{887887- u_int16_t mii17 = lmc_mii_readreg (sc, 0, 17);888888- if (((mii17 >> 3) & 7) == 7)889889- {890890- lmc_led_off (sc, LMC_MII16_LED2);891891- }892892- else893893- {894894- lmc_led_on (sc, LMC_MII16_LED2);895895- }896896-892892+ u16 mii17 = lmc_mii_readreg(sc, 0, 17);893893+ if (((mii17 >> 3) & 7) == 7)894894+ lmc_led_off(sc, LMC_MII16_LED2);895895+ else896896+ lmc_led_on(sc, LMC_MII16_LED2);897897}898898899899/*···917929static void918930lmc_t1_init (lmc_softc_t * const sc)919931{920920- u_int16_t mii16;932932+ u16 mii16;921933 int i;922934923935 sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC1200;···10161028 */ static int10171029lmc_t1_get_link_status (lmc_softc_t * const sc)10181030{10191019- u_int16_t link_status;10311031+ u16 link_status;10201032 int ret = 1;1021103310221034 /* LMC5245 (DS3) & LMC1200 (DS1) LED definitions
+27-123
drivers/net/wan/lmc/lmc_proto.c
···3636#include <linux/workqueue.h>3737#include <linux/proc_fs.h>3838#include <linux/bitops.h>3939-4040-#include <net/syncppp.h>4141-4239#include <asm/processor.h> /* Processor type for cache alignment. */4340#include <asm/io.h>4441#include <asm/dma.h>···4750#include "lmc_ioctl.h"4851#include "lmc_proto.h"49525050-/*5151- * The compile-time variable SPPPSTUP causes the module to be5252- * compiled without referencing any of the sync ppp routines.5353- */5454-#ifdef SPPPSTUB5555-#define SPPP_detach(d) (void)05656-#define SPPP_open(d) 05757-#define SPPP_reopen(d) (void)05858-#define SPPP_close(d) (void)05959-#define SPPP_attach(d) (void)06060-#define SPPP_do_ioctl(d,i,c) -EOPNOTSUPP6161-#else6262-#define SPPP_attach(x) sppp_attach((x)->pd)6363-#define SPPP_detach(x) sppp_detach((x)->pd->dev)6464-#define SPPP_open(x) sppp_open((x)->pd->dev)6565-#define SPPP_reopen(x) sppp_reopen((x)->pd->dev)6666-#define SPPP_close(x) sppp_close((x)->pd->dev)6767-#define SPPP_do_ioctl(x, y, z) sppp_do_ioctl((x)->pd->dev, (y), (z))6868-#endif6969-7070-// init7171-void lmc_proto_init(lmc_softc_t *sc) /*FOLD00*/7272-{7373- lmc_trace(sc->lmc_device, "lmc_proto_init in");7474- switch(sc->if_type){7575- case LMC_PPP:7676- sc->pd = kmalloc(sizeof(struct ppp_device), GFP_KERNEL);7777- if (!sc->pd) {7878- printk("lmc_proto_init(): kmalloc failure!\n");7979- return;8080- }8181- sc->pd->dev = sc->lmc_device;8282- sc->if_ptr = sc->pd;8383- break;8484- case LMC_RAW:8585- break;8686- default:8787- break;8888- }8989- lmc_trace(sc->lmc_device, "lmc_proto_init out");9090-}9191-9253// attach9354void lmc_proto_attach(lmc_softc_t *sc) /*FOLD00*/9455{···55100 case LMC_PPP:56101 {57102 struct net_device *dev = sc->lmc_device;5858- SPPP_attach(sc);59103 dev->do_ioctl = lmc_ioctl;60104 }61105 break;···62108 {63109 struct net_device *dev = sc->lmc_device;64110 /*6565- * They set a few basics because they don't use sync_ppp111111+ * They set a few basics because they don't use HDLC66112 */67113 dev->flags |= IFF_POINTOPOINT;68114···78124 lmc_trace(sc->lmc_device, "lmc_proto_attach out");79125}801268181-// detach8282-void lmc_proto_detach(lmc_softc_t *sc) /*FOLD00*/127127+int lmc_proto_ioctl(lmc_softc_t *sc, struct ifreq *ifr, int cmd)83128{8484- switch(sc->if_type){8585- case LMC_PPP:8686- SPPP_detach(sc);8787- break;8888- case LMC_RAW: /* Tell someone we're detaching? */8989- break;9090- default:9191- break;9292- }9393-129129+ lmc_trace(sc->lmc_device, "lmc_proto_ioctl");130130+ if (sc->if_type == LMC_PPP)131131+ return hdlc_ioctl(sc->lmc_device, ifr, cmd);132132+ return -EOPNOTSUPP;94133}951349696-// reopen9797-void lmc_proto_reopen(lmc_softc_t *sc) /*FOLD00*/135135+int lmc_proto_open(lmc_softc_t *sc)98136{9999- lmc_trace(sc->lmc_device, "lmc_proto_reopen in");100100- switch(sc->if_type){101101- case LMC_PPP:102102- SPPP_reopen(sc);103103- break;104104- case LMC_RAW: /* Reset the interface after being down, prerape to receive packets again */105105- break;106106- default:107107- break;108108- }109109- lmc_trace(sc->lmc_device, "lmc_proto_reopen out");137137+ int ret = 0;138138+139139+ lmc_trace(sc->lmc_device, "lmc_proto_open in");140140+141141+ if (sc->if_type == LMC_PPP) {142142+ ret = hdlc_open(sc->lmc_device);143143+ if (ret < 0)144144+ printk(KERN_WARNING "%s: HDLC open failed: %d\n",145145+ sc->name, ret);146146+ }147147+148148+ lmc_trace(sc->lmc_device, "lmc_proto_open out");149149+ return ret;110150}111151112112-113113-// ioctl114114-int lmc_proto_ioctl(lmc_softc_t *sc, struct ifreq *ifr, int cmd) /*FOLD00*/152152+void lmc_proto_close(lmc_softc_t *sc)115153{116116- lmc_trace(sc->lmc_device, "lmc_proto_ioctl out");117117- switch(sc->if_type){118118- case LMC_PPP:119119- return SPPP_do_ioctl (sc, ifr, cmd);120120- break;121121- default:122122- return -EOPNOTSUPP;123123- break;124124- }125125- lmc_trace(sc->lmc_device, "lmc_proto_ioctl out");126126-}154154+ lmc_trace(sc->lmc_device, "lmc_proto_close in");127155128128-// open129129-void lmc_proto_open(lmc_softc_t *sc) /*FOLD00*/130130-{131131- int ret;156156+ if (sc->if_type == LMC_PPP)157157+ hdlc_close(sc->lmc_device);132158133133- lmc_trace(sc->lmc_device, "lmc_proto_open in");134134- switch(sc->if_type){135135- case LMC_PPP:136136- ret = SPPP_open(sc);137137- if(ret < 0)138138- printk("%s: syncPPP open failed: %d\n", sc->name, ret);139139- break;140140- case LMC_RAW: /* We're about to start getting packets! */141141- break;142142- default:143143- break;144144- }145145- lmc_trace(sc->lmc_device, "lmc_proto_open out");146146-}147147-148148-// close149149-150150-void lmc_proto_close(lmc_softc_t *sc) /*FOLD00*/151151-{152152- lmc_trace(sc->lmc_device, "lmc_proto_close in");153153- switch(sc->if_type){154154- case LMC_PPP:155155- SPPP_close(sc);156156- break;157157- case LMC_RAW: /* Interface going down */158158- break;159159- default:160160- break;161161- }162162- lmc_trace(sc->lmc_device, "lmc_proto_close out");159159+ lmc_trace(sc->lmc_device, "lmc_proto_close out");163160}164161165162__be16 lmc_proto_type(lmc_softc_t *sc, struct sk_buff *skb) /*FOLD00*/···118213 lmc_trace(sc->lmc_device, "lmc_proto_type in");119214 switch(sc->if_type){120215 case LMC_PPP:121121- return htons(ETH_P_WAN_PPP);122122- break;216216+ return hdlc_type_trans(skb, sc->lmc_device);217217+ break;123218 case LMC_NET:124219 return htons(ETH_P_802_2);125220 break;···150245 }151246 lmc_trace(sc->lmc_device, "lmc_proto_netif out");152247}153153-
···88 *99 * (c) Copyright 1999, 2001 Alan Cox1010 * (c) Copyright 2001 Red Hat Inc.1111+ * Generic HDLC port Copyright (C) 2008 Krzysztof Halasa <khc@pm.waw.pl>1112 *1213 */1314···2019#include <linux/netdevice.h>2120#include <linux/if_arp.h>2221#include <linux/delay.h>2222+#include <linux/hdlc.h>2323#include <linux/ioport.h>2424#include <linux/init.h>2525#include <net/arp.h>···2927#include <asm/io.h>3028#include <asm/dma.h>3129#include <asm/byteorder.h>3232-#include <net/syncppp.h>3330#include "z85230.h"343135323633struct slvl_device3734{3838- void *if_ptr; /* General purpose pointer (used by SPPP) */3935 struct z8530_channel *chan;4040- struct ppp_device pppdev;4136 int channel;4237};433844394540struct slvl_board4641{4747- struct slvl_device *dev[2];4242+ struct slvl_device dev[2];4843 struct z8530_dev board;4944 int iobase;5045};···5051 * Network driver support routines5152 */52535454+static inline struct slvl_device* dev_to_chan(struct net_device *dev)5555+{5656+ return (struct slvl_device *)dev_to_hdlc(dev)->priv;5757+}5858+5359/*5454- * Frame receive. Simple for our card as we do sync ppp and there6060+ * Frame receive. Simple for our card as we do HDLC and there5561 * is no funny garbage involved5662 */5757-6363+5864static void sealevel_input(struct z8530_channel *c, struct sk_buff *skb)5965{6066 /* Drop the CRC - it's not a good idea to try and negotiate it ;) */6161- skb_trim(skb, skb->len-2);6262- skb->protocol=htons(ETH_P_WAN_PPP);6767+ skb_trim(skb, skb->len - 2);6868+ skb->protocol = hdlc_type_trans(skb, c->netdevice);6369 skb_reset_mac_header(skb);6464- skb->dev=c->netdevice;6565- /*6666- * Send it to the PPP layer. We don't have time to process6767- * it right now.6868- */7070+ skb->dev = c->netdevice;6971 netif_rx(skb);7072 c->netdevice->last_rx = jiffies;7173}7272-7474+7375/*7476 * We've been placed in the UP state7575- */ 7676-7777+ */7878+7779static int sealevel_open(struct net_device *d)7880{7979- struct slvl_device *slvl=d->priv;8181+ struct slvl_device *slvl = dev_to_chan(d);8082 int err = -1;8183 int unit = slvl->channel;8282-8484+8385 /*8484- * Link layer up. 8686+ * Link layer up.8587 */86888787- switch(unit)8989+ switch (unit)8890 {8991 case 0:9090- err=z8530_sync_dma_open(d, slvl->chan);9292+ err = z8530_sync_dma_open(d, slvl->chan);9193 break;9294 case 1:9393- err=z8530_sync_open(d, slvl->chan);9595+ err = z8530_sync_open(d, slvl->chan);9496 break;9597 }9696-9797- if(err)9898+9999+ if (err)98100 return err;9999- /*100100- * Begin PPP101101- */102102- err=sppp_open(d);103103- if(err)104104- {105105- switch(unit)106106- {101101+102102+ err = hdlc_open(d);103103+ if (err) {104104+ switch (unit) {107105 case 0:108106 z8530_sync_dma_close(d, slvl->chan);109107 break;110108 case 1:111109 z8530_sync_close(d, slvl->chan);112110 break;113113- } 111111+ }114112 return err;115113 }116116-117117- slvl->chan->rx_function=sealevel_input;118118-114114+115115+ slvl->chan->rx_function = sealevel_input;116116+119117 /*120118 * Go go go121119 */···122126123127static int sealevel_close(struct net_device *d)124128{125125- struct slvl_device *slvl=d->priv;129129+ struct slvl_device *slvl = dev_to_chan(d);126130 int unit = slvl->channel;127127-131131+128132 /*129133 * Discard new frames130134 */131131-132132- slvl->chan->rx_function=z8530_null_rx;133133-134134- /*135135- * PPP off136136- */137137- sppp_close(d);138138- /*139139- * Link layer down140140- */141135136136+ slvl->chan->rx_function = z8530_null_rx;137137+138138+ hdlc_close(d);142139 netif_stop_queue(d);143143-144144- switch(unit)140140+141141+ switch (unit)145142 {146143 case 0:147144 z8530_sync_dma_close(d, slvl->chan);···148159149160static int sealevel_ioctl(struct net_device *d, struct ifreq *ifr, int cmd)150161{151151- /* struct slvl_device *slvl=d->priv;162162+ /* struct slvl_device *slvl=dev_to_chan(d);152163 z8530_ioctl(d,&slvl->sync.chanA,ifr,cmd) */153153- return sppp_do_ioctl(d, ifr,cmd);154154-}155155-156156-static struct net_device_stats *sealevel_get_stats(struct net_device *d)157157-{158158- struct slvl_device *slvl=d->priv;159159- if(slvl)160160- return z8530_get_stats(slvl->chan);161161- else162162- return NULL;164164+ return hdlc_ioctl(d, ifr, cmd);163165}164166165167/*166166- * Passed PPP frames, fire them downwind.168168+ * Passed network frames, fire them downwind.167169 */168168-170170+169171static int sealevel_queue_xmit(struct sk_buff *skb, struct net_device *d)170172{171171- struct slvl_device *slvl=d->priv;172172- return z8530_queue_xmit(slvl->chan, skb);173173+ return z8530_queue_xmit(dev_to_chan(d)->chan, skb);173174}174175175175-static int sealevel_neigh_setup(struct neighbour *n)176176+static int sealevel_attach(struct net_device *dev, unsigned short encoding,177177+ unsigned short parity)176178{177177- if (n->nud_state == NUD_NONE) {178178- n->ops = &arp_broken_ops;179179- n->output = n->ops->output;179179+ if (encoding == ENCODING_NRZ && parity == PARITY_CRC16_PR1_CCITT)180180+ return 0;181181+ return -EINVAL;182182+}183183+184184+static int slvl_setup(struct slvl_device *sv, int iobase, int irq)185185+{186186+ struct net_device *dev = alloc_hdlcdev(sv);187187+ if (!dev)188188+ return -1;189189+190190+ dev_to_hdlc(dev)->attach = sealevel_attach;191191+ dev_to_hdlc(dev)->xmit = sealevel_queue_xmit;192192+ dev->open = sealevel_open;193193+ dev->stop = sealevel_close;194194+ dev->do_ioctl = sealevel_ioctl;195195+ dev->base_addr = iobase;196196+ dev->irq = irq;197197+198198+ if (register_hdlc_device(dev)) {199199+ printk(KERN_ERR "sealevel: unable to register HDLC device\n");200200+ free_netdev(dev);201201+ return -1;180202 }203203+204204+ sv->chan->netdevice = dev;181205 return 0;182182-}183183-184184-static int sealevel_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p)185185-{186186- if (p->tbl->family == AF_INET) {187187- p->neigh_setup = sealevel_neigh_setup;188188- p->ucast_probes = 0;189189- p->mcast_probes = 0;190190- }191191- return 0;192192-}193193-194194-static int sealevel_attach(struct net_device *dev)195195-{196196- struct slvl_device *sv = dev->priv;197197- sppp_attach(&sv->pppdev);198198- return 0;199199-}200200-201201-static void sealevel_detach(struct net_device *dev)202202-{203203- sppp_detach(dev);204204-}205205-206206-static void slvl_setup(struct net_device *d)207207-{208208- d->open = sealevel_open;209209- d->stop = sealevel_close;210210- d->init = sealevel_attach;211211- d->uninit = sealevel_detach;212212- d->hard_start_xmit = sealevel_queue_xmit;213213- d->get_stats = sealevel_get_stats;214214- d->set_multicast_list = NULL;215215- d->do_ioctl = sealevel_ioctl;216216- d->neigh_setup = sealevel_neigh_setup_dev;217217- d->set_mac_address = NULL;218218-219219-}220220-221221-static inline struct slvl_device *slvl_alloc(int iobase, int irq)222222-{223223- struct net_device *d;224224- struct slvl_device *sv;225225-226226- d = alloc_netdev(sizeof(struct slvl_device), "hdlc%d",227227- slvl_setup);228228-229229- if (!d) 230230- return NULL;231231-232232- sv = d->priv;233233- d->ml_priv = sv;234234- sv->if_ptr = &sv->pppdev;235235- sv->pppdev.dev = d;236236- d->base_addr = iobase;237237- d->irq = irq;238238-239239- return sv;240206}241207242208243209/*244210 * Allocate and setup Sealevel board.245211 */246246-247247-static __init struct slvl_board *slvl_init(int iobase, int irq, 212212+213213+static __init struct slvl_board *slvl_init(int iobase, int irq,248214 int txdma, int rxdma, int slow)249215{250216 struct z8530_dev *dev;251217 struct slvl_board *b;252252-218218+253219 /*254220 * Get the needed I/O space255221 */256222257257- if(!request_region(iobase, 8, "Sealevel 4021")) 258258- { 259259- printk(KERN_WARNING "sealevel: I/O 0x%X already in use.\n", iobase);223223+ if (!request_region(iobase, 8, "Sealevel 4021")) {224224+ printk(KERN_WARNING "sealevel: I/O 0x%X already in use.\n",225225+ iobase);260226 return NULL;261227 }262262-228228+263229 b = kzalloc(sizeof(struct slvl_board), GFP_KERNEL);264264- if(!b)265265- goto fail3;230230+ if (!b)231231+ goto err_kzalloc;266232267267- if (!(b->dev[0]= slvl_alloc(iobase, irq)))268268- goto fail2;233233+ b->dev[0].chan = &b->board.chanA;234234+ b->dev[0].channel = 0;269235270270- b->dev[0]->chan = &b->board.chanA; 271271- b->dev[0]->channel = 0;272272-273273- if (!(b->dev[1] = slvl_alloc(iobase, irq)))274274- goto fail1_0;275275-276276- b->dev[1]->chan = &b->board.chanB;277277- b->dev[1]->channel = 1;236236+ b->dev[1].chan = &b->board.chanB;237237+ b->dev[1].channel = 1;278238279239 dev = &b->board;280280-240240+281241 /*282242 * Stuff in the I/O addressing283243 */284284-244244+285245 dev->active = 0;286246287247 b->iobase = iobase;288288-248248+289249 /*290250 * Select 8530 delays for the old board291251 */292292-293293- if(slow)252252+253253+ if (slow)294254 iobase |= Z8530_PORT_SLEEP;295295-296296- dev->chanA.ctrlio=iobase+1;297297- dev->chanA.dataio=iobase;298298- dev->chanB.ctrlio=iobase+3;299299- dev->chanB.dataio=iobase+2;300300-301301- dev->chanA.irqs=&z8530_nop;302302- dev->chanB.irqs=&z8530_nop;303303-255255+256256+ dev->chanA.ctrlio = iobase + 1;257257+ dev->chanA.dataio = iobase;258258+ dev->chanB.ctrlio = iobase + 3;259259+ dev->chanB.dataio = iobase + 2;260260+261261+ dev->chanA.irqs = &z8530_nop;262262+ dev->chanB.irqs = &z8530_nop;263263+304264 /*305265 * Assert DTR enable DMA306266 */307307-308308- outb(3|(1<<7), b->iobase+4); 309309-267267+268268+ outb(3 | (1 << 7), b->iobase + 4);269269+310270311271 /* We want a fast IRQ for this device. Actually we'd like an even faster312272 IRQ ;) - This is one driver RtLinux is made for */313313-314314- if(request_irq(irq, &z8530_interrupt, IRQF_DISABLED, "SeaLevel", dev)<0)315315- {316316- printk(KERN_WARNING "sealevel: IRQ %d already in use.\n", irq);317317- goto fail1_1;318318- }319319-320320- dev->irq=irq;321321- dev->chanA.private=&b->dev[0];322322- dev->chanB.private=&b->dev[1];323323- dev->chanA.netdevice=b->dev[0]->pppdev.dev;324324- dev->chanB.netdevice=b->dev[1]->pppdev.dev;325325- dev->chanA.dev=dev;326326- dev->chanB.dev=dev;327273328328- dev->chanA.txdma=3;329329- dev->chanA.rxdma=1;330330- if(request_dma(dev->chanA.txdma, "SeaLevel (TX)")!=0)331331- goto fail;332332-333333- if(request_dma(dev->chanA.rxdma, "SeaLevel (RX)")!=0)334334- goto dmafail;335335-274274+ if (request_irq(irq, &z8530_interrupt, IRQF_DISABLED,275275+ "SeaLevel", dev) < 0) {276276+ printk(KERN_WARNING "sealevel: IRQ %d already in use.\n", irq);277277+ goto err_request_irq;278278+ }279279+280280+ dev->irq = irq;281281+ dev->chanA.private = &b->dev[0];282282+ dev->chanB.private = &b->dev[1];283283+ dev->chanA.dev = dev;284284+ dev->chanB.dev = dev;285285+286286+ dev->chanA.txdma = 3;287287+ dev->chanA.rxdma = 1;288288+ if (request_dma(dev->chanA.txdma, "SeaLevel (TX)"))289289+ goto err_dma_tx;290290+291291+ if (request_dma(dev->chanA.rxdma, "SeaLevel (RX)"))292292+ goto err_dma_rx;293293+336294 disable_irq(irq);337337-295295+338296 /*339297 * Begin normal initialise340298 */341341-342342- if(z8530_init(dev)!=0)343343- {299299+300300+ if (z8530_init(dev) != 0) {344301 printk(KERN_ERR "Z8530 series device not found.\n");345302 enable_irq(irq);346346- goto dmafail2;303303+ goto free_hw;347304 }348348- if(dev->type==Z85C30)349349- {305305+ if (dev->type == Z85C30) {350306 z8530_channel_load(&dev->chanA, z8530_hdlc_kilostream);351307 z8530_channel_load(&dev->chanB, z8530_hdlc_kilostream);352352- }353353- else354354- {308308+ } else {355309 z8530_channel_load(&dev->chanA, z8530_hdlc_kilostream_85230);356310 z8530_channel_load(&dev->chanB, z8530_hdlc_kilostream_85230);357311 }···302370 /*303371 * Now we can take the IRQ304372 */305305-373373+306374 enable_irq(irq);307375308308- if (register_netdev(b->dev[0]->pppdev.dev)) 309309- goto dmafail2;310310-311311- if (register_netdev(b->dev[1]->pppdev.dev)) 312312- goto fail_unit;376376+ if (slvl_setup(&b->dev[0], iobase, irq))377377+ goto free_hw;378378+ if (slvl_setup(&b->dev[1], iobase, irq))379379+ goto free_netdev0;313380314381 z8530_describe(dev, "I/O", iobase);315315- dev->active=1;382382+ dev->active = 1;316383 return b;317384318318-fail_unit:319319- unregister_netdev(b->dev[0]->pppdev.dev);320320-321321-dmafail2:385385+free_netdev0:386386+ unregister_hdlc_device(b->dev[0].chan->netdevice);387387+ free_netdev(b->dev[0].chan->netdevice);388388+free_hw:322389 free_dma(dev->chanA.rxdma);323323-dmafail:390390+err_dma_rx:324391 free_dma(dev->chanA.txdma);325325-fail:392392+err_dma_tx:326393 free_irq(irq, dev);327327-fail1_1:328328- free_netdev(b->dev[1]->pppdev.dev);329329-fail1_0:330330- free_netdev(b->dev[0]->pppdev.dev);331331-fail2:394394+err_request_irq:332395 kfree(b);333333-fail3:334334- release_region(iobase,8);396396+err_kzalloc:397397+ release_region(iobase, 8);335398 return NULL;336399}337400···335408 int u;336409337410 z8530_shutdown(&b->board);338338-339339- for(u=0; u<2; u++)411411+412412+ for (u = 0; u < 2; u++)340413 {341341- struct net_device *d = b->dev[u]->pppdev.dev;342342- unregister_netdev(d);414414+ struct net_device *d = b->dev[u].chan->netdevice;415415+ unregister_hdlc_device(d);343416 free_netdev(d);344417 }345345-418418+346419 free_irq(b->board.irq, &b->board);347420 free_dma(b->board.chanA.rxdma);348421 free_dma(b->board.chanA.txdma);···378451379452static int __init slvl_init_module(void)380453{381381-#ifdef MODULE382382- printk(KERN_INFO "SeaLevel Z85230 Synchronous Driver v 0.02.\n");383383- printk(KERN_INFO "(c) Copyright 1998, Building Number Three Ltd.\n");384384-#endif385454 slvl_unit = slvl_init(io, irq, txdma, rxdma, slow);386455387456 return slvl_unit ? 0 : -ENODEV;
-9
drivers/net/wan/syncppp.c
···230230 skb->dev=dev;231231 skb_reset_mac_header(skb);232232233233- if (dev->flags & IFF_RUNNING)234234- {235235- /* Count received bytes, add FCS and one flag */236236- sp->ibytes+= skb->len + 3;237237- sp->ipkts++;238238- }239239-240233 if (!pskb_may_pull(skb, PPP_HEADER_LEN)) {241234 /* Too small packet, drop it. */242235 if (sp->pp_flags & PP_DEBUG)···825832 sppp_print_bytes ((u8*) (lh+1), len);826833 printk (">\n");827834 }828828- sp->obytes += skb->len;829835 /* Control is high priority so it doesn't get queued behind data */830836 skb->priority=TC_PRIO_CONTROL;831837 skb->dev = dev;···867875 printk (KERN_WARNING "%s: cisco output: <%xh %xh %xh %xh %xh-%xh>\n",868876 dev->name, ntohl (ch->type), ch->par1,869877 ch->par2, ch->rel, ch->time0, ch->time1);870870- sp->obytes += skb->len;871878 skb->priority=TC_PRIO_CONTROL;872879 skb->dev = dev;873880 skb_queue_tail(&tx_queue, skb);
+77-116
drivers/net/wan/z85230.c
···4343#include <linux/netdevice.h>4444#include <linux/if_arp.h>4545#include <linux/delay.h>4646+#include <linux/hdlc.h>4647#include <linux/ioport.h>4748#include <linux/init.h>4849#include <asm/dma.h>···5251#define RT_UNLOCK5352#include <linux/spinlock.h>54535555-#include <net/syncppp.h>5654#include "z85230.h"57555856···440440 * A status event occurred in PIO synchronous mode. There are several441441 * reasons the chip will bother us here. A transmit underrun means we442442 * failed to feed the chip fast enough and just broke a packet. A DCD443443- * change is a line up or down. We communicate that back to the protocol444444- * layer for synchronous PPP to renegotiate.443443+ * change is a line up or down.445444 */446445447446static void z8530_status(struct z8530_channel *chan)448447{449448 u8 status, altered;450449451451- status=read_zsreg(chan, R0);452452- altered=chan->status^status;453453-454454- chan->status=status;455455-456456- if(status&TxEOM)457457- {450450+ status = read_zsreg(chan, R0);451451+ altered = chan->status ^ status;452452+453453+ chan->status = status;454454+455455+ if (status & TxEOM) {458456/* printk("%s: Tx underrun.\n", chan->dev->name); */459459- chan->stats.tx_fifo_errors++;457457+ chan->netdevice->stats.tx_fifo_errors++;460458 write_zsctrl(chan, ERR_RES);461459 z8530_tx_done(chan);462460 }463463-464464- if(altered&chan->dcdcheck)461461+462462+ if (altered & chan->dcdcheck)465463 {466466- if(status&chan->dcdcheck)467467- {464464+ if (status & chan->dcdcheck) {468465 printk(KERN_INFO "%s: DCD raised\n", chan->dev->name);469469- write_zsreg(chan, R3, chan->regs[3]|RxENABLE);470470- if(chan->netdevice &&471471- ((chan->netdevice->type == ARPHRD_HDLC) ||472472- (chan->netdevice->type == ARPHRD_PPP)))473473- sppp_reopen(chan->netdevice);474474- }475475- else476476- {466466+ write_zsreg(chan, R3, chan->regs[3] | RxENABLE);467467+ if (chan->netdevice)468468+ netif_carrier_on(chan->netdevice);469469+ } else {477470 printk(KERN_INFO "%s: DCD lost\n", chan->dev->name);478478- write_zsreg(chan, R3, chan->regs[3]&~RxENABLE);471471+ write_zsreg(chan, R3, chan->regs[3] & ~RxENABLE);479472 z8530_flush_fifo(chan);473473+ if (chan->netdevice)474474+ netif_carrier_off(chan->netdevice);480475 }481481-482482- } 476476+477477+ }483478 write_zsctrl(chan, RES_EXT_INT);484479 write_zsctrl(chan, RES_H_IUS);485480}486481487487-struct z8530_irqhandler z8530_sync=482482+struct z8530_irqhandler z8530_sync =488483{489484 z8530_rx,490485 z8530_tx,···551556 * 552557 * A status event occurred on the Z8530. We receive these for two reasons553558 * when in DMA mode. Firstly if we finished a packet transfer we get one554554- * and kick the next packet out. Secondly we may see a DCD change and555555- * have to poke the protocol layer.559559+ * and kick the next packet out. Secondly we may see a DCD change.556560 *557561 */558562···580586 }581587 }582588583583- if(altered&chan->dcdcheck)589589+ if (altered & chan->dcdcheck)584590 {585585- if(status&chan->dcdcheck)586586- {591591+ if (status & chan->dcdcheck) {587592 printk(KERN_INFO "%s: DCD raised\n", chan->dev->name);588588- write_zsreg(chan, R3, chan->regs[3]|RxENABLE);589589- if(chan->netdevice &&590590- ((chan->netdevice->type == ARPHRD_HDLC) ||591591- (chan->netdevice->type == ARPHRD_PPP)))592592- sppp_reopen(chan->netdevice);593593- }594594- else595595- {593593+ write_zsreg(chan, R3, chan->regs[3] | RxENABLE);594594+ if (chan->netdevice)595595+ netif_carrier_on(chan->netdevice);596596+ } else {596597 printk(KERN_INFO "%s:DCD lost\n", chan->dev->name);597597- write_zsreg(chan, R3, chan->regs[3]&~RxENABLE);598598+ write_zsreg(chan, R3, chan->regs[3] & ~RxENABLE);598599 z8530_flush_fifo(chan);600600+ if (chan->netdevice)601601+ netif_carrier_off(chan->netdevice);599602 }600600- } 603603+ }601604602605 write_zsctrl(chan, RES_EXT_INT);603606 write_zsctrl(chan, RES_H_IUS);···14501459 /*14511460 * Check if we crapped out.14521461 */14531453- if(get_dma_residue(c->txdma))14621462+ if (get_dma_residue(c->txdma))14541463 {14551455- c->stats.tx_dropped++;14561456- c->stats.tx_fifo_errors++;14641464+ c->netdevice->stats.tx_dropped++;14651465+ c->netdevice->stats.tx_fifo_errors++;14571466 }14581467 release_dma_lock(flags);14591468 }···15251534 * packet. This code is fairly timing sensitive.15261535 *15271536 * Called with the register lock held.15281528- */ 15291529-15371537+ */15381538+15301539static void z8530_tx_done(struct z8530_channel *c)15311540{15321541 struct sk_buff *skb;1533154215341543 /* Actually this can happen.*/15351535- if(c->tx_skb==NULL)15441544+ if (c->tx_skb == NULL)15361545 return;1537154615381538- skb=c->tx_skb;15391539- c->tx_skb=NULL;15471547+ skb = c->tx_skb;15481548+ c->tx_skb = NULL;15401549 z8530_tx_begin(c);15411541- c->stats.tx_packets++;15421542- c->stats.tx_bytes+=skb->len;15501550+ c->netdevice->stats.tx_packets++;15511551+ c->netdevice->stats.tx_bytes += skb->len;15431552 dev_kfree_skb_irq(skb);15441553}15451554···15491558 * @skb: The buffer15501559 *15511560 * We point the receive handler at this function when idle. Instead15521552- * of syncppp processing the frames we get to throw them away.15611561+ * of processing the frames we get to throw them away.15531562 */1554156315551564void z8530_null_rx(struct z8530_channel *c, struct sk_buff *skb)···16261635 else16271636 /* Can't occur as we dont reenable the DMA irq until16281637 after the flip is done */16291629- printk(KERN_WARNING "%s: DMA flip overrun!\n", c->netdevice->name);16301630-16381638+ printk(KERN_WARNING "%s: DMA flip overrun!\n",16391639+ c->netdevice->name);16401640+16311641 release_dma_lock(flags);16321632-16421642+16331643 /*16341644 * Shove the old buffer into an sk_buff. We can't DMA16351645 * directly into one on a PC - it might be above the 16Mb···16381646 * can avoid the copy. Optimisation 2 - make the memcpy16391647 * a copychecksum.16401648 */16411641-16421642- skb=dev_alloc_skb(ct);16431643- if(skb==NULL)16441644- {16451645- c->stats.rx_dropped++;16461646- printk(KERN_WARNING "%s: Memory squeeze.\n", c->netdevice->name);16471647- }16481648- else16491649- {16491649+16501650+ skb = dev_alloc_skb(ct);16511651+ if (skb == NULL) {16521652+ c->netdevice->stats.rx_dropped++;16531653+ printk(KERN_WARNING "%s: Memory squeeze.\n",16541654+ c->netdevice->name);16551655+ } else {16501656 skb_put(skb, ct);16511657 skb_copy_to_linear_data(skb, rxb, ct);16521652- c->stats.rx_packets++;16531653- c->stats.rx_bytes+=ct;16581658+ c->netdevice->stats.rx_packets++;16591659+ c->netdevice->stats.rx_bytes += ct;16541660 }16551655- c->dma_ready=1;16561656- }16571657- else16581658- {16591659- RT_LOCK; 16601660- skb=c->skb;16611661-16611661+ c->dma_ready = 1;16621662+ } else {16631663+ RT_LOCK;16641664+ skb = c->skb;16651665+16621666 /*16631667 * The game we play for non DMA is similar. We want to16641668 * get the controller set up for the next packet as fast···16651677 * if you build a system where the sync irq isnt blocked16661678 * by the kernel IRQ disable then you need only block the16671679 * sync IRQ for the RT_LOCK area.16681668- * 16801680+ *16691681 */16701682 ct=c->count;16711671-16831683+16721684 c->skb = c->skb2;16731685 c->count = 0;16741686 c->max = c->mtu;16751675- if(c->skb)16761676- {16871687+ if (c->skb) {16771688 c->dptr = c->skb->data;16781689 c->max = c->mtu;16791679- }16801680- else16811681- {16821682- c->count= 0;16901690+ } else {16911691+ c->count = 0;16831692 c->max = 0;16841693 }16851694 RT_UNLOCK;1686169516871696 c->skb2 = dev_alloc_skb(c->mtu);16881688- if(c->skb2==NULL)16971697+ if (c->skb2 == NULL)16891698 printk(KERN_WARNING "%s: memory squeeze.\n",16901690- c->netdevice->name);16991699+ c->netdevice->name);16911700 else16921692- {16931693- skb_put(c->skb2,c->mtu);16941694- }16951695- c->stats.rx_packets++;16961696- c->stats.rx_bytes+=ct;16971697-17011701+ skb_put(c->skb2, c->mtu);17021702+ c->netdevice->stats.rx_packets++;17031703+ c->netdevice->stats.rx_bytes += ct;16981704 }16991705 /*17001706 * If we received a frame we must now process it.17011707 */17021702- if(skb)17031703- {17081708+ if (skb) {17041709 skb_trim(skb, ct);17051705- c->rx_function(c,skb);17061706- }17071707- else17081708- {17091709- c->stats.rx_dropped++;17101710+ c->rx_function(c, skb);17111711+ } else {17121712+ c->netdevice->stats.rx_dropped++;17101713 printk(KERN_ERR "%s: Lost a frame\n", c->netdevice->name);17111714 }17121715}···17091730 * Returns true if the buffer cross a DMA boundary on a PC. The poor17101731 * thing can only DMA within a 64K block not across the edges of it.17111732 */17121712-17331733+17131734static inline int spans_boundary(struct sk_buff *skb)17141735{17151736 unsigned long a=(unsigned long)skb->data;···17771798}1778179917791800EXPORT_SYMBOL(z8530_queue_xmit);17801780-17811781-/**17821782- * z8530_get_stats - Get network statistics17831783- * @c: The channel to use17841784- *17851785- * Get the statistics block. We keep the statistics in software as17861786- * the chip doesn't do it for us.17871787- *17881788- * Locking is ignored here - we could lock for a copy but its17891789- * not likely to be that big an issue17901790- */17911791-17921792-struct net_device_stats *z8530_get_stats(struct z8530_channel *c)17931793-{17941794- return &c->stats;17951795-}17961796-17971797-EXPORT_SYMBOL(z8530_get_stats);1798180117991802/*18001803 * Module support
···19981998 else19991999 priv->mc_count = mc_count;20002000 }20012001-20022002- /* Since we can set the promiscuous flag when it wasn't asked20032003- for, make sure the net_device knows about it. */20042004- if (priv->promiscuous)20052005- dev->flags |= IFF_PROMISC;20062006- else20072007- dev->flags &= ~IFF_PROMISC;20082001}2009200220102003/* This must be called from user context, without locks held - use
-3
drivers/net/wireless/wavelan.c
···14091409 lp->mc_count = 0;1410141014111411 wv_82586_reconfig(dev);14121412-14131413- /* Tell the kernel that we are doing a really bad job. */14141414- dev->flags |= IFF_PROMISC;14151412 }14161413 } else14171414 /* Are there multicast addresses to send? */