Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 294348 Details for
Bug 233255
Megahertz EM1144-T pcmcia ethernet adapter doesn't work
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
Diff of changes between 2.6.15 and 2.6.22
smc91c92_cs.diff (text/plain), 24.92 KB, created by
Christopher Brown
on 2008-02-08 12:55:13 UTC
(
hide
)
Description:
Diff of changes between 2.6.15 and 2.6.22
Filename:
MIME Type:
Creator:
Christopher Brown
Created:
2008-02-08 12:55:13 UTC
Size:
24.92 KB
patch
obsolete
>--- 2.6.15/smc91c92_cs.c 2006-01-03 03:21:10.000000000 +0000 >+++ 2.6.22/smc91c92_cs.c 2007-07-09 00:32:16.000000000 +0100 >@@ -49,6 +49,7 @@ > #include <pcmcia/cisreg.h> > #include <pcmcia/ciscode.h> > #include <pcmcia/ds.h> >+#include <pcmcia/ss.h> > > #include <asm/io.h> > #include <asm/system.h> >@@ -59,7 +60,7 @@ > > /*====================================================================*/ > >-static char *if_names[] = { "auto", "10baseT", "10base2"}; >+static const char *if_names[] = { "auto", "10baseT", "10base2"}; > > /* Module parameters */ > >@@ -79,14 +80,14 @@ > #ifdef PCMCIA_DEBUG > INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG); > static const char *version = >-"smc91c92_cs.c 0.09 1996/8/4 Donald Becker, becker@scyld.com.\n"; >+"smc91c92_cs.c 1.123 2006/11/09 Donald Becker, becker@scyld.com.\n"; > #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args) > #else > #define DEBUG(n, args...) > #endif > > #define DRV_NAME "smc91c92_cs" >-#define DRV_VERSION "1.122" >+#define DRV_VERSION "1.123" > > /*====================================================================*/ > >@@ -102,12 +103,8 @@ > currently have room for another Tx packet. */ > #define MEMORY_WAIT_TIME 8 > >-static dev_info_t dev_info = "smc91c92_cs"; >- >-static dev_link_t *dev_list; >- > struct smc_private { >- dev_link_t link; >+ struct pcmcia_device *p_dev; > spinlock_t lock; > u_short manfid; > u_short cardid; >@@ -281,19 +278,16 @@ > > /*====================================================================*/ > >-static dev_link_t *smc91c92_attach(void); >-static void smc91c92_detach(dev_link_t *); >-static void smc91c92_config(dev_link_t *link); >-static void smc91c92_release(dev_link_t *link); >-static int smc91c92_event(event_t event, int priority, >- event_callback_args_t *args); >+static void smc91c92_detach(struct pcmcia_device *p_dev); >+static int smc91c92_config(struct pcmcia_device *link); >+static void smc91c92_release(struct pcmcia_device *link); > > static int smc_open(struct net_device *dev); > static int smc_close(struct net_device *dev); > static int smc_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); > static void smc_tx_timeout(struct net_device *dev); > static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev); >-static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs); >+static irqreturn_t smc_interrupt(int irq, void *dev_id); > static void smc_rx(struct net_device *dev); > static struct net_device_stats *smc_get_stats(struct net_device *dev); > static void set_rx_mode(struct net_device *dev); >@@ -305,7 +299,7 @@ > static int mdio_read(struct net_device *dev, int phy_id, int loc); > static void mdio_write(struct net_device *dev, int phy_id, int loc, int value); > static int smc_link_ok(struct net_device *dev); >-static struct ethtool_ops ethtool_ops; >+static const struct ethtool_ops ethtool_ops; > > /*====================================================================== > >@@ -315,22 +309,19 @@ > > ======================================================================*/ > >-static dev_link_t *smc91c92_attach(void) >+static int smc91c92_probe(struct pcmcia_device *link) > { >- client_reg_t client_reg; > struct smc_private *smc; >- dev_link_t *link; > struct net_device *dev; >- int ret; > > DEBUG(0, "smc91c92_attach()\n"); > > /* Create new ethernet device */ > dev = alloc_etherdev(sizeof(struct smc_private)); > if (!dev) >- return NULL; >+ return -ENOMEM; > smc = netdev_priv(dev); >- link = &smc->link; >+ smc->p_dev = link; > link->priv = dev; > > spin_lock_init(&smc->lock); >@@ -342,7 +333,6 @@ > link->irq.Handler = &smc_interrupt; > link->irq.Instance = dev; > link->conf.Attributes = CONF_ENABLE_IRQ; >- link->conf.Vcc = 50; > link->conf.IntType = INT_MEMORY_AND_IO; > > /* The SMC91c92-specific entries in the device structure. */ >@@ -366,20 +356,7 @@ > smc->mii_if.phy_id_mask = 0x1f; > smc->mii_if.reg_num_mask = 0x1f; > >- /* Register with Card Services */ >- link->next = dev_list; >- dev_list = link; >- client_reg.dev_info = &dev_info; >- client_reg.Version = 0x0210; >- client_reg.event_callback_args.client_data = link; >- ret = pcmcia_register_client(&link->handle, &client_reg); >- if (ret != 0) { >- cs_error(link->handle, RegisterClient, ret); >- smc91c92_detach(link); >- return NULL; >- } >- >- return link; >+ return smc91c92_config(link); > } /* smc91c92_attach */ > > /*====================================================================== >@@ -391,30 +368,17 @@ > > ======================================================================*/ > >-static void smc91c92_detach(dev_link_t *link) >+static void smc91c92_detach(struct pcmcia_device *link) > { > struct net_device *dev = link->priv; >- dev_link_t **linkp; > > DEBUG(0, "smc91c92_detach(0x%p)\n", link); > >- /* Locate device structure */ >- for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) >- if (*linkp == link) break; >- if (*linkp == NULL) >- return; >- >- if (link->dev) >+ if (link->dev_node) > unregister_netdev(dev); > >- if (link->state & DEV_CONFIG) >- smc91c92_release(link); >- >- if (link->handle) >- pcmcia_deregister_client(link->handle); >+ smc91c92_release(link); > >- /* Unlink device structure, free bits */ >- *linkp = link->next; > free_netdev(dev); > } /* smc91c92_detach */ > >@@ -441,7 +405,7 @@ > > /*====================================================================*/ > >-static int first_tuple(client_handle_t handle, tuple_t *tuple, >+static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, > cisparse_t *parse) > { > int i; >@@ -452,7 +416,7 @@ > return pcmcia_parse_tuple(handle, tuple, parse); > } > >-static int next_tuple(client_handle_t handle, tuple_t *tuple, >+static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple, > cisparse_t *parse) > { > int i; >@@ -474,7 +438,7 @@ > > ======================================================================*/ > >-static int mhz_3288_power(dev_link_t *link) >+static int mhz_3288_power(struct pcmcia_device *link) > { > struct net_device *dev = link->priv; > struct smc_private *smc = netdev_priv(dev); >@@ -496,7 +460,7 @@ > return 0; > } > >-static int mhz_mfc_config(dev_link_t *link) >+static int mhz_mfc_config(struct pcmcia_device *link) > { > struct net_device *dev = link->priv; > struct smc_private *smc = netdev_priv(dev); >@@ -531,7 +495,7 @@ > tuple->TupleDataMax = 255; > tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY; > >- i = first_tuple(link->handle, tuple, parse); >+ i = first_tuple(link, tuple, parse); > /* The Megahertz combo cards have modem-like CIS entries, so > we have to explicitly try a bunch of port combinations. */ > while (i == CS_SUCCESS) { >@@ -540,11 +504,11 @@ > for (k = 0; k < 0x400; k += 0x10) { > if (k & 0x80) continue; > link->io.BasePort1 = k ^ 0x300; >- i = pcmcia_request_io(link->handle, &link->io); >+ i = pcmcia_request_io(link, &link->io); > if (i == CS_SUCCESS) break; > } > if (i == CS_SUCCESS) break; >- i = next_tuple(link->handle, tuple, parse); >+ i = next_tuple(link, tuple, parse); > } > if (i != CS_SUCCESS) > goto free_cfg_mem; >@@ -554,7 +518,7 @@ > req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; > req.Base = req.Size = 0; > req.AccessSpeed = 0; >- i = pcmcia_request_window(&link->handle, &req, &link->win); >+ i = pcmcia_request_window(&link, &req, &link->win); > if (i != CS_SUCCESS) > goto free_cfg_mem; > smc->base = ioremap(req.Base, req.Size); >@@ -573,9 +537,8 @@ > return i; > } > >-static int mhz_setup(dev_link_t *link) >+static int mhz_setup(struct pcmcia_device *link) > { >- client_handle_t handle = link->handle; > struct net_device *dev = link->priv; > struct smc_cfg_mem *cfg_mem; > tuple_t *tuple; >@@ -597,16 +560,8 @@ > > /* Read the station address from the CIS. It is stored as the last > (fourth) string in the Version 1 Version/ID tuple. */ >- tuple->DesiredTuple = CISTPL_VERS_1; >- if (first_tuple(handle, tuple, parse) != CS_SUCCESS) { >- rc = -1; >- goto free_cfg_mem; >- } >- /* Ugh -- the EM1144 card has two VERS_1 tuples!?! */ >- if (next_tuple(handle, tuple, parse) != CS_SUCCESS) >- first_tuple(handle, tuple, parse); >- if (parse->version_1.ns > 3) { >- station_addr = parse->version_1.str + parse->version_1.ofs[3]; >+ if (link->prod_id[3]) { >+ station_addr = link->prod_id[3]; > if (cvt_ascii_address(dev, station_addr) == 0) { > rc = 0; > goto free_cfg_mem; >@@ -615,11 +570,11 @@ > > /* Another possibility: for the EM3288, in a special tuple */ > tuple->DesiredTuple = 0x81; >- if (pcmcia_get_first_tuple(handle, tuple) != CS_SUCCESS) { >+ if (pcmcia_get_first_tuple(link, tuple) != CS_SUCCESS) { > rc = -1; > goto free_cfg_mem; > } >- if (pcmcia_get_tuple_data(handle, tuple) != CS_SUCCESS) { >+ if (pcmcia_get_tuple_data(link, tuple) != CS_SUCCESS) { > rc = -1; > goto free_cfg_mem; > } >@@ -643,7 +598,7 @@ > > ======================================================================*/ > >-static void mot_config(dev_link_t *link) >+static void mot_config(struct pcmcia_device *link) > { > struct net_device *dev = link->priv; > struct smc_private *smc = netdev_priv(dev); >@@ -664,7 +619,7 @@ > mdelay(100); > } > >-static int mot_setup(dev_link_t *link) >+static int mot_setup(struct pcmcia_device *link) > { > struct net_device *dev = link->priv; > kio_addr_t ioaddr = dev->base_addr; >@@ -698,7 +653,7 @@ > > /*====================================================================*/ > >-static int smc_config(dev_link_t *link) >+static int smc_config(struct pcmcia_device *link) > { > struct net_device *dev = link->priv; > struct smc_cfg_mem *cfg_mem; >@@ -723,16 +678,16 @@ > tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY; > > link->io.NumPorts1 = 16; >- i = first_tuple(link->handle, tuple, parse); >+ i = first_tuple(link, tuple, parse); > while (i != CS_NO_MORE_ITEMS) { > if (i == CS_SUCCESS) { > link->conf.ConfigIndex = cf->index; > link->io.BasePort1 = cf->io.win[0].base; > link->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK; >- i = pcmcia_request_io(link->handle, &link->io); >+ i = pcmcia_request_io(link, &link->io); > if (i == CS_SUCCESS) break; > } >- i = next_tuple(link->handle, tuple, parse); >+ i = next_tuple(link, tuple, parse); > } > if (i == CS_SUCCESS) > dev->base_addr = link->io.BasePort1; >@@ -741,9 +696,8 @@ > return i; > } > >-static int smc_setup(dev_link_t *link) >+static int smc_setup(struct pcmcia_device *link) > { >- client_handle_t handle = link->handle; > struct net_device *dev = link->priv; > struct smc_cfg_mem *cfg_mem; > tuple_t *tuple; >@@ -766,11 +720,11 @@ > > /* Check for a LAN function extension tuple */ > tuple->DesiredTuple = CISTPL_FUNCE; >- i = first_tuple(handle, tuple, parse); >+ i = first_tuple(link, tuple, parse); > while (i == CS_SUCCESS) { > if (parse->funce.type == CISTPL_FUNCE_LAN_NODE_ID) > break; >- i = next_tuple(handle, tuple, parse); >+ i = next_tuple(link, tuple, parse); > } > if (i == CS_SUCCESS) { > node_id = (cistpl_lan_node_id_t *)parse->funce.data; >@@ -782,15 +736,12 @@ > } > } > /* Try the third string in the Version 1 Version/ID tuple. */ >- tuple->DesiredTuple = CISTPL_VERS_1; >- if (first_tuple(handle, tuple, parse) != CS_SUCCESS) { >- rc = -1; >- goto free_cfg_mem; >- } >- station_addr = parse->version_1.str + parse->version_1.ofs[2]; >- if (cvt_ascii_address(dev, station_addr) == 0) { >- rc = 0; >- goto free_cfg_mem; >+ if (link->prod_id[2]) { >+ station_addr = link->prod_id[2]; >+ if (cvt_ascii_address(dev, station_addr) == 0) { >+ rc = 0; >+ goto free_cfg_mem; >+ } > } > > rc = -1; >@@ -801,10 +752,10 @@ > > /*====================================================================*/ > >-static int osi_config(dev_link_t *link) >+static int osi_config(struct pcmcia_device *link) > { > struct net_device *dev = link->priv; >- static kio_addr_t com[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 }; >+ static const kio_addr_t com[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 }; > int i, j; > > link->conf.Attributes |= CONF_ENABLE_SPKR; >@@ -821,22 +772,21 @@ > > for (i = j = 0; j < 4; j++) { > link->io.BasePort2 = com[j]; >- i = pcmcia_request_io(link->handle, &link->io); >+ i = pcmcia_request_io(link, &link->io); > if (i == CS_SUCCESS) break; > } > if (i != CS_SUCCESS) { > /* Fallback: turn off hard decode */ > link->conf.ConfigIndex = 0x03; > link->io.NumPorts2 = 0; >- i = pcmcia_request_io(link->handle, &link->io); >+ i = pcmcia_request_io(link, &link->io); > } > dev->base_addr = link->io.BasePort1 + 0x10; > return i; > } > >-static int osi_setup(dev_link_t *link, u_short manfid, u_short cardid) >+static int osi_setup(struct pcmcia_device *link, u_short manfid, u_short cardid) > { >- client_handle_t handle = link->handle; > struct net_device *dev = link->priv; > struct smc_cfg_mem *cfg_mem; > tuple_t *tuple; >@@ -857,12 +807,12 @@ > > /* Read the station address from tuple 0x90, subtuple 0x04 */ > tuple->DesiredTuple = 0x90; >- i = pcmcia_get_first_tuple(handle, tuple); >+ i = pcmcia_get_first_tuple(link, tuple); > while (i == CS_SUCCESS) { >- i = pcmcia_get_tuple_data(handle, tuple); >+ i = pcmcia_get_tuple_data(link, tuple); > if ((i != CS_SUCCESS) || (buf[0] == 0x04)) > break; >- i = pcmcia_get_next_tuple(handle, tuple); >+ i = pcmcia_get_next_tuple(link, tuple); > } > if (i != CS_SUCCESS) { > rc = -1; >@@ -895,6 +845,52 @@ > return rc; > } > >+static int smc91c92_suspend(struct pcmcia_device *link) >+{ >+ struct net_device *dev = link->priv; >+ >+ if (link->open) >+ netif_device_detach(dev); >+ >+ return 0; >+} >+ >+static int smc91c92_resume(struct pcmcia_device *link) >+{ >+ struct net_device *dev = link->priv; >+ struct smc_private *smc = netdev_priv(dev); >+ int i; >+ >+ if ((smc->manfid == MANFID_MEGAHERTZ) && >+ (smc->cardid == PRODID_MEGAHERTZ_EM3288)) >+ mhz_3288_power(link); >+ if (smc->manfid == MANFID_MOTOROLA) >+ mot_config(link); >+ if ((smc->manfid == MANFID_OSITECH) && >+ (smc->cardid != PRODID_OSITECH_SEVEN)) { >+ /* Power up the card and enable interrupts */ >+ set_bits(0x0300, dev->base_addr-0x10+OSITECH_AUI_PWR); >+ set_bits(0x0300, dev->base_addr-0x10+OSITECH_RESET_ISR); >+ } >+ if (((smc->manfid == MANFID_OSITECH) && >+ (smc->cardid == PRODID_OSITECH_SEVEN)) || >+ ((smc->manfid == MANFID_PSION) && >+ (smc->cardid == PRODID_PSION_NET100))) { >+ /* Download the Seven of Diamonds firmware */ >+ for (i = 0; i < sizeof(__Xilinx7OD); i++) { >+ outb(__Xilinx7OD[i], link->io.BasePort1+2); >+ udelay(50); >+ } >+ } >+ if (link->open) { >+ smc_reset(dev); >+ netif_device_attach(dev); >+ } >+ >+ return 0; >+} >+ >+ > /*====================================================================== > > This verifies that the chip is some SMC91cXX variant, and returns >@@ -902,7 +898,7 @@ > > ======================================================================*/ > >-static int check_sig(dev_link_t *link) >+static int check_sig(struct pcmcia_device *link) > { > struct net_device *dev = link->priv; > kio_addr_t ioaddr = dev->base_addr; >@@ -935,15 +931,15 @@ > } > > if (width) { >- event_callback_args_t args; >- printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n"); >- args.client_data = link; >- smc91c92_event(CS_EVENT_RESET_PHYSICAL, 0, &args); >- pcmcia_release_io(link->handle, &link->io); >- link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; >- pcmcia_request_io(link->handle, &link->io); >- smc91c92_event(CS_EVENT_CARD_RESET, 0, &args); >- return check_sig(link); >+ modconf_t mod = { >+ .Attributes = CONF_IO_CHANGE_WIDTH, >+ }; >+ printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n"); >+ >+ smc91c92_suspend(link); >+ pcmcia_modify_configuration(link, &mod); >+ smc91c92_resume(link); >+ return check_sig(link); > } > return -ENODEV; > } >@@ -957,17 +953,12 @@ > ======================================================================*/ > > #define CS_EXIT_TEST(ret, svc, label) \ >-if (ret != CS_SUCCESS) { cs_error(link->handle, svc, ret); goto label; } >+if (ret != CS_SUCCESS) { cs_error(link, svc, ret); goto label; } > >-static void smc91c92_config(dev_link_t *link) >+static int smc91c92_config(struct pcmcia_device *link) > { >- client_handle_t handle = link->handle; > struct net_device *dev = link->priv; > struct smc_private *smc = netdev_priv(dev); >- struct smc_cfg_mem *cfg_mem; >- tuple_t *tuple; >- cisparse_t *parse; >- u_char *buf; > char *name; > int i, j, rev; > kio_addr_t ioaddr; >@@ -975,33 +966,8 @@ > > DEBUG(0, "smc91c92_config(0x%p)\n", link); > >- cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL); >- if (!cfg_mem) >- goto config_failed; >- >- tuple = &cfg_mem->tuple; >- parse = &cfg_mem->parse; >- buf = cfg_mem->buf; >- >- tuple->Attributes = tuple->TupleOffset = 0; >- tuple->TupleData = (cisdata_t *)buf; >- tuple->TupleDataMax = 64; >- >- tuple->DesiredTuple = CISTPL_CONFIG; >- i = first_tuple(handle, tuple, parse); >- CS_EXIT_TEST(i, ParseTuple, config_failed); >- link->conf.ConfigBase = parse->config.base; >- link->conf.Present = parse->config.rmask[0]; >- >- tuple->DesiredTuple = CISTPL_MANFID; >- tuple->Attributes = TUPLE_RETURN_COMMON; >- if (first_tuple(handle, tuple, parse) == CS_SUCCESS) { >- smc->manfid = parse->manfid.manf; >- smc->cardid = parse->manfid.card; >- } >- >- /* Configure card */ >- link->state |= DEV_CONFIG; >+ smc->manfid = link->manf_id; >+ smc->cardid = link->card_id; > > if ((smc->manfid == MANFID_OSITECH) && > (smc->cardid != PRODID_OSITECH_SEVEN)) { >@@ -1016,9 +982,9 @@ > } > CS_EXIT_TEST(i, RequestIO, config_failed); > >- i = pcmcia_request_irq(link->handle, &link->irq); >+ i = pcmcia_request_irq(link, &link->irq); > CS_EXIT_TEST(i, RequestIRQ, config_failed); >- i = pcmcia_request_configuration(link->handle, &link->conf); >+ i = pcmcia_request_configuration(link, &link->conf); > CS_EXIT_TEST(i, RequestConfiguration, config_failed); > > if (smc->manfid == MANFID_MOTOROLA) >@@ -1097,13 +1063,12 @@ > SMC_SELECT_BANK(0); > } > >- link->dev = &smc->node; >- link->state &= ~DEV_CONFIG_PENDING; >- SET_NETDEV_DEV(dev, &handle_to_dev(handle)); >+ link->dev_node = &smc->node; >+ SET_NETDEV_DEV(dev, &handle_to_dev(link)); > > if (register_netdev(dev) != 0) { > printk(KERN_ERR "smc91c92_cs: register_netdev() failed\n"); >- link->dev = NULL; >+ link->dev_node = NULL; > goto config_undo; > } > >@@ -1132,16 +1097,13 @@ > printk(KERN_NOTICE " No MII transceivers found!\n"); > } > } >- kfree(cfg_mem); >- return; >+ return 0; > > config_undo: > unregister_netdev(dev); > config_failed: /* CS_EXIT_TEST() calls jump to here... */ > smc91c92_release(link); >- link->state &= ~DEV_CONFIG_PENDING; >- kfree(cfg_mem); >- >+ return -ENODEV; > } /* smc91c92_config */ > > /*====================================================================== >@@ -1152,99 +1114,16 @@ > > ======================================================================*/ > >-static void smc91c92_release(dev_link_t *link) >-{ >- >- DEBUG(0, "smc91c92_release(0x%p)\n", link); >- >- pcmcia_release_configuration(link->handle); >- pcmcia_release_io(link->handle, &link->io); >- pcmcia_release_irq(link->handle, &link->irq); >- if (link->win) { >- struct net_device *dev = link->priv; >- struct smc_private *smc = netdev_priv(dev); >- iounmap(smc->base); >- pcmcia_release_window(link->win); >- } >- >- link->state &= ~DEV_CONFIG; >-} >- >-/*====================================================================== >- >- The card status event handler. Mostly, this schedules other >- stuff to run after an event is received. A CARD_REMOVAL event >- also sets some flags to discourage the net drivers from trying >- to talk to the card any more. >- >-======================================================================*/ >- >-static int smc91c92_event(event_t event, int priority, >- event_callback_args_t *args) >+static void smc91c92_release(struct pcmcia_device *link) > { >- dev_link_t *link = args->client_data; >- struct net_device *dev = link->priv; >- struct smc_private *smc = netdev_priv(dev); >- int i; >- >- DEBUG(1, "smc91c92_event(0x%06x)\n", event); >- >- switch (event) { >- case CS_EVENT_CARD_REMOVAL: >- link->state &= ~DEV_PRESENT; >- if (link->state & DEV_CONFIG) >- netif_device_detach(dev); >- break; >- case CS_EVENT_CARD_INSERTION: >- link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; >- smc91c92_config(link); >- break; >- case CS_EVENT_PM_SUSPEND: >- link->state |= DEV_SUSPEND; >- /* Fall through... */ >- case CS_EVENT_RESET_PHYSICAL: >- if (link->state & DEV_CONFIG) { >- if (link->open) >- netif_device_detach(dev); >- pcmcia_release_configuration(link->handle); >- } >- break; >- case CS_EVENT_PM_RESUME: >- link->state &= ~DEV_SUSPEND; >- /* Fall through... */ >- case CS_EVENT_CARD_RESET: >- if (link->state & DEV_CONFIG) { >- if ((smc->manfid == MANFID_MEGAHERTZ) && >- (smc->cardid == PRODID_MEGAHERTZ_EM3288)) >- mhz_3288_power(link); >- pcmcia_request_configuration(link->handle, &link->conf); >- if (smc->manfid == MANFID_MOTOROLA) >- mot_config(link); >- if ((smc->manfid == MANFID_OSITECH) && >- (smc->cardid != PRODID_OSITECH_SEVEN)) { >- /* Power up the card and enable interrupts */ >- set_bits(0x0300, dev->base_addr-0x10+OSITECH_AUI_PWR); >- set_bits(0x0300, dev->base_addr-0x10+OSITECH_RESET_ISR); >- } >- if (((smc->manfid == MANFID_OSITECH) && >- (smc->cardid == PRODID_OSITECH_SEVEN)) || >- ((smc->manfid == MANFID_PSION) && >- (smc->cardid == PRODID_PSION_NET100))) { >- /* Download the Seven of Diamonds firmware */ >- for (i = 0; i < sizeof(__Xilinx7OD); i++) { >- outb(__Xilinx7OD[i], link->io.BasePort1+2); >- udelay(50); >- } >- } >- if (link->open) { >- smc_reset(dev); >- netif_device_attach(dev); >- } >+ DEBUG(0, "smc91c92_release(0x%p)\n", link); >+ if (link->win) { >+ struct net_device *dev = link->priv; >+ struct smc_private *smc = netdev_priv(dev); >+ iounmap(smc->base); > } >- break; >- } >- return 0; >-} /* smc91c92_event */ >+ pcmcia_disable_device(link); >+} > > /*====================================================================== > >@@ -1332,7 +1211,7 @@ > static int smc_open(struct net_device *dev) > { > struct smc_private *smc = netdev_priv(dev); >- dev_link_t *link = &smc->link; >+ struct pcmcia_device *link = smc->p_dev; > > #ifdef PCMCIA_DEBUG > DEBUG(0, "%s: smc_open(%p), ID/Window %4.4x.\n", >@@ -1341,7 +1220,7 @@ > #endif > > /* Check that the PCMCIA card is still here. */ >- if (!DEV_OK(link)) >+ if (!pcmcia_dev_present(link)) > return -ENODEV; > /* Physical device present signature. */ > if (check_sig(link) < 0) { >@@ -1369,7 +1248,7 @@ > static int smc_close(struct net_device *dev) > { > struct smc_private *smc = netdev_priv(dev); >- dev_link_t *link = &smc->link; >+ struct pcmcia_device *link = smc->p_dev; > kio_addr_t ioaddr = dev->base_addr; > > DEBUG(0, "%s: smc_close(), status %4.4x.\n", >@@ -1627,7 +1506,7 @@ > > /*====================================================================*/ > >-static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs) >+static irqreturn_t smc_interrupt(int irq, void *dev_id) > { > struct net_device *dev = dev_id; > struct smc_private *smc = netdev_priv(dev); >@@ -1790,7 +1669,6 @@ > (packet_length+1)>>1); > skb->protocol = eth_type_trans(skb, dev); > >- skb->dev = dev; > netif_rx(skb); > dev->last_rx = jiffies; > smc->stats.rx_packets++; >@@ -1862,7 +1740,6 @@ > u_short rx_cfg_setting; > > if (dev->flags & IFF_PROMISC) { >- printk(KERN_NOTICE "%s: setting Rx mode to promiscuous.\n", dev->name); > rx_cfg_setting = RxStripCRC | RxEnable | RxPromisc | RxAllMulti; > } else if (dev->flags & IFF_ALLMULTI) > rx_cfg_setting = RxStripCRC | RxEnable | RxAllMulti; >@@ -1965,7 +1842,7 @@ > /* Set the Window 1 control, configuration and station addr registers. > No point in writing the I/O base register ;-> */ > SMC_SELECT_BANK(1); >- /* Automatically release succesfully transmitted packets, >+ /* Automatically release successfully transmitted packets, > Accept link errors, counter and Tx error interrupts. */ > outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE, > ioaddr + CONTROL); >@@ -2049,7 +1926,7 @@ > if (smc->watchdog++ && ((i>>8) & i)) { > if (!smc->fast_poll) > printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name); >- smc_interrupt(dev->irq, smc, NULL); >+ smc_interrupt(dev->irq, dev); > smc->fast_poll = HZ; > } > if (smc->fast_poll) { >@@ -2290,7 +2167,7 @@ > return -EOPNOTSUPP; > } > >-static struct ethtool_ops ethtool_ops = { >+static const struct ethtool_ops ethtool_ops = { > .begin = check_if_running, > .get_drvinfo = smc_get_drvinfo, > .get_settings = smc_get_settings, >@@ -2360,10 +2237,11 @@ > .drv = { > .name = "smc91c92_cs", > }, >- .attach = smc91c92_attach, >- .event = smc91c92_event, >- .detach = smc91c92_detach, >+ .probe = smc91c92_probe, >+ .remove = smc91c92_detach, > .id_table = smc91c92_ids, >+ .suspend = smc91c92_suspend, >+ .resume = smc91c92_resume, > }; > > static int __init init_smc91c92_cs(void) >@@ -2374,7 +2252,6 @@ > static void __exit exit_smc91c92_cs(void) > { > pcmcia_unregister_driver(&smc91c92_cs_driver); >- BUG_ON(dev_list != NULL); > } > > module_init(init_smc91c92_cs);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 233255
:
293878
|
293879
|
294330
| 294348 |
294350