1023 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/* drivers/net/ethernet/8390/ax88796.c3 *4 * Copyright 2005,2007 Simtec Electronics5 * Ben Dooks <ben@simtec.co.uk>6 *7 * Asix AX88796 10/100 Ethernet controller support8 * Based on ne.c, by Donald Becker, et-al.9 */10 11#include <linux/module.h>12#include <linux/kernel.h>13#include <linux/errno.h>14#include <linux/isapnp.h>15#include <linux/interrupt.h>16#include <linux/io.h>17#include <linux/platform_device.h>18#include <linux/delay.h>19#include <linux/timer.h>20#include <linux/netdevice.h>21#include <linux/etherdevice.h>22#include <linux/ethtool.h>23#include <linux/mdio-bitbang.h>24#include <linux/phy.h>25#include <linux/eeprom_93cx6.h>26#include <linux/slab.h>27 28#include <net/ax88796.h>29 30 31/* Rename the lib8390.c functions to show that they are in this driver */32#define __ei_open ax_ei_open33#define __ei_close ax_ei_close34#define __ei_poll ax_ei_poll35#define __ei_start_xmit ax_ei_start_xmit36#define __ei_tx_timeout ax_ei_tx_timeout37#define __ei_get_stats ax_ei_get_stats38#define __ei_set_multicast_list ax_ei_set_multicast_list39#define __ei_interrupt ax_ei_interrupt40#define ____alloc_ei_netdev ax__alloc_ei_netdev41#define __NS8390_init ax_NS8390_init42 43/* force unsigned long back to 'void __iomem *' */44#define ax_convert_addr(_a) ((void __force __iomem *)(_a))45 46#define ei_inb(_a) readb(ax_convert_addr(_a))47#define ei_outb(_v, _a) writeb(_v, ax_convert_addr(_a))48 49#define ei_inb_p(_a) ei_inb(_a)50#define ei_outb_p(_v, _a) ei_outb(_v, _a)51 52/* define EI_SHIFT() to take into account our register offsets */53#define EI_SHIFT(x) (ei_local->reg_offset[(x)])54 55/* Ensure we have our RCR base value */56#define AX88796_PLATFORM57 58static unsigned char version[] = "ax88796.c: Copyright 2005,2007 Simtec Electronics\n";59 60#include "lib8390.c"61 62#define DRV_NAME "ax88796"63#define DRV_VERSION "1.00"64 65/* from ne.c */66#define NE_CMD EI_SHIFT(0x00)67#define NE_RESET EI_SHIFT(0x1f)68#define NE_DATAPORT EI_SHIFT(0x10)69 70#define NE1SM_START_PG 0x20 /* First page of TX buffer */71#define NE1SM_STOP_PG 0x40 /* Last page +1 of RX ring */72#define NESM_START_PG 0x40 /* First page of TX buffer */73#define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */74 75#define AX_GPOC_PPDSET BIT(6)76 77/* device private data */78 79struct ax_device {80 struct mii_bus *mii_bus;81 struct mdiobb_ctrl bb_ctrl;82 void __iomem *addr_memr;83 u8 reg_memr;84 int link;85 int speed;86 int duplex;87 88 void __iomem *map2;89 const struct ax_plat_data *plat;90 91 unsigned char running;92 unsigned char resume_open;93 unsigned int irqflags;94 95 u32 reg_offsets[0x20];96};97 98static inline struct ax_device *to_ax_dev(struct net_device *dev)99{100 struct ei_device *ei_local = netdev_priv(dev);101 return (struct ax_device *)(ei_local + 1);102}103 104void ax_NS8390_reinit(struct net_device *dev)105{106 ax_NS8390_init(dev, 1);107}108 109EXPORT_SYMBOL_GPL(ax_NS8390_reinit);110 111/*112 * ax_initial_check113 *114 * do an initial probe for the card to check whether it exists115 * and is functional116 */117static int ax_initial_check(struct net_device *dev)118{119 struct ei_device *ei_local = netdev_priv(dev);120 void __iomem *ioaddr = ei_local->mem;121 int reg0;122 int regd;123 124 reg0 = ei_inb(ioaddr);125 if (reg0 == 0xFF)126 return -ENODEV;127 128 ei_outb(E8390_NODMA + E8390_PAGE1 + E8390_STOP, ioaddr + E8390_CMD);129 regd = ei_inb(ioaddr + 0x0d);130 ei_outb(0xff, ioaddr + 0x0d);131 ei_outb(E8390_NODMA + E8390_PAGE0, ioaddr + E8390_CMD);132 ei_inb(ioaddr + EN0_COUNTER0); /* Clear the counter by reading. */133 if (ei_inb(ioaddr + EN0_COUNTER0) != 0) {134 ei_outb(reg0, ioaddr);135 ei_outb(regd, ioaddr + 0x0d); /* Restore the old values. */136 return -ENODEV;137 }138 139 return 0;140}141 142/*143 * Hard reset the card. This used to pause for the same period that a144 * 8390 reset command required, but that shouldn't be necessary.145 */146static void ax_reset_8390(struct net_device *dev)147{148 struct ei_device *ei_local = netdev_priv(dev);149 unsigned long reset_start_time = jiffies;150 void __iomem *addr = (void __iomem *)dev->base_addr;151 152 netif_dbg(ei_local, hw, dev, "resetting the 8390 t=%ld...\n", jiffies);153 154 ei_outb(ei_inb(addr + NE_RESET), addr + NE_RESET);155 156 ei_local->txing = 0;157 ei_local->dmaing = 0;158 159 /* This check _should_not_ be necessary, omit eventually. */160 while ((ei_inb(addr + EN0_ISR) & ENISR_RESET) == 0) {161 if (time_after(jiffies, reset_start_time + 2 * HZ / 100)) {162 netdev_warn(dev, "%s: did not complete.\n", __func__);163 break;164 }165 }166 167 ei_outb(ENISR_RESET, addr + EN0_ISR); /* Ack intr. */168}169 170/* Wrapper for __ei_interrupt for platforms that have a platform-specific171 * way to find out whether the interrupt request might be caused by172 * the ax88796 chip.173 */174static irqreturn_t ax_ei_interrupt_filtered(int irq, void *dev_id)175{176 struct net_device *dev = dev_id;177 struct ax_device *ax = to_ax_dev(dev);178 struct platform_device *pdev = to_platform_device(dev->dev.parent);179 180 if (!ax->plat->check_irq(pdev))181 return IRQ_NONE;182 183 return ax_ei_interrupt(irq, dev_id);184}185 186static void ax_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,187 int ring_page)188{189 struct ei_device *ei_local = netdev_priv(dev);190 void __iomem *nic_base = ei_local->mem;191 192 /* This *shouldn't* happen. If it does, it's the last thing you'll see */193 if (ei_local->dmaing) {194 netdev_err(dev, "DMAing conflict in %s "195 "[DMAstat:%d][irqlock:%d].\n",196 __func__,197 ei_local->dmaing, ei_local->irqlock);198 return;199 }200 201 ei_local->dmaing |= 0x01;202 ei_outb(E8390_NODMA + E8390_PAGE0 + E8390_START, nic_base + NE_CMD);203 ei_outb(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);204 ei_outb(0, nic_base + EN0_RCNTHI);205 ei_outb(0, nic_base + EN0_RSARLO); /* On page boundary */206 ei_outb(ring_page, nic_base + EN0_RSARHI);207 ei_outb(E8390_RREAD+E8390_START, nic_base + NE_CMD);208 209 if (ei_local->word16)210 ioread16_rep(nic_base + NE_DATAPORT, hdr,211 sizeof(struct e8390_pkt_hdr) >> 1);212 else213 ioread8_rep(nic_base + NE_DATAPORT, hdr,214 sizeof(struct e8390_pkt_hdr));215 216 ei_outb(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */217 ei_local->dmaing &= ~0x01;218 219 le16_to_cpus(&hdr->count);220}221 222 223/*224 * Block input and output, similar to the Crynwr packet driver. If225 * you are porting to a new ethercard, look at the packet driver226 * source for hints. The NEx000 doesn't share the on-board packet227 * memory -- you have to put the packet out through the "remote DMA"228 * dataport using ei_outb.229 */230static void ax_block_input(struct net_device *dev, int count,231 struct sk_buff *skb, int ring_offset)232{233 struct ei_device *ei_local = netdev_priv(dev);234 void __iomem *nic_base = ei_local->mem;235 char *buf = skb->data;236 237 if (ei_local->dmaing) {238 netdev_err(dev,239 "DMAing conflict in %s "240 "[DMAstat:%d][irqlock:%d].\n",241 __func__,242 ei_local->dmaing, ei_local->irqlock);243 return;244 }245 246 ei_local->dmaing |= 0x01;247 248 ei_outb(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base + NE_CMD);249 ei_outb(count & 0xff, nic_base + EN0_RCNTLO);250 ei_outb(count >> 8, nic_base + EN0_RCNTHI);251 ei_outb(ring_offset & 0xff, nic_base + EN0_RSARLO);252 ei_outb(ring_offset >> 8, nic_base + EN0_RSARHI);253 ei_outb(E8390_RREAD+E8390_START, nic_base + NE_CMD);254 255 if (ei_local->word16) {256 ioread16_rep(nic_base + NE_DATAPORT, buf, count >> 1);257 if (count & 0x01)258 buf[count-1] = ei_inb(nic_base + NE_DATAPORT);259 260 } else {261 ioread8_rep(nic_base + NE_DATAPORT, buf, count);262 }263 264 ei_local->dmaing &= ~1;265}266 267static void ax_block_output(struct net_device *dev, int count,268 const unsigned char *buf, const int start_page)269{270 struct ei_device *ei_local = netdev_priv(dev);271 void __iomem *nic_base = ei_local->mem;272 unsigned long dma_start;273 274 /*275 * Round the count up for word writes. Do we need to do this?276 * What effect will an odd byte count have on the 8390? I277 * should check someday.278 */279 if (ei_local->word16 && (count & 0x01))280 count++;281 282 /* This *shouldn't* happen. If it does, it's the last thing you'll see */283 if (ei_local->dmaing) {284 netdev_err(dev, "DMAing conflict in %s."285 "[DMAstat:%d][irqlock:%d]\n",286 __func__,287 ei_local->dmaing, ei_local->irqlock);288 return;289 }290 291 ei_local->dmaing |= 0x01;292 /* We should already be in page 0, but to be safe... */293 ei_outb(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);294 295 ei_outb(ENISR_RDC, nic_base + EN0_ISR);296 297 /* Now the normal output. */298 ei_outb(count & 0xff, nic_base + EN0_RCNTLO);299 ei_outb(count >> 8, nic_base + EN0_RCNTHI);300 ei_outb(0x00, nic_base + EN0_RSARLO);301 ei_outb(start_page, nic_base + EN0_RSARHI);302 303 ei_outb(E8390_RWRITE+E8390_START, nic_base + NE_CMD);304 if (ei_local->word16)305 iowrite16_rep(nic_base + NE_DATAPORT, buf, count >> 1);306 else307 iowrite8_rep(nic_base + NE_DATAPORT, buf, count);308 309 dma_start = jiffies;310 311 while ((ei_inb(nic_base + EN0_ISR) & ENISR_RDC) == 0) {312 if (time_after(jiffies, dma_start + 2 * HZ / 100)) { /* 20ms */313 netdev_warn(dev, "timeout waiting for Tx RDC.\n");314 ax_reset_8390(dev);315 ax_NS8390_init(dev, 1);316 break;317 }318 }319 320 ei_outb(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */321 ei_local->dmaing &= ~0x01;322}323 324/* definitions for accessing MII/EEPROM interface */325 326#define AX_MEMR EI_SHIFT(0x14)327#define AX_MEMR_MDC BIT(0)328#define AX_MEMR_MDIR BIT(1)329#define AX_MEMR_MDI BIT(2)330#define AX_MEMR_MDO BIT(3)331#define AX_MEMR_EECS BIT(4)332#define AX_MEMR_EEI BIT(5)333#define AX_MEMR_EEO BIT(6)334#define AX_MEMR_EECLK BIT(7)335 336static void ax_handle_link_change(struct net_device *dev)337{338 struct ax_device *ax = to_ax_dev(dev);339 struct phy_device *phy_dev = dev->phydev;340 int status_change = 0;341 342 if (phy_dev->link && ((ax->speed != phy_dev->speed) ||343 (ax->duplex != phy_dev->duplex))) {344 345 ax->speed = phy_dev->speed;346 ax->duplex = phy_dev->duplex;347 status_change = 1;348 }349 350 if (phy_dev->link != ax->link) {351 if (!phy_dev->link) {352 ax->speed = 0;353 ax->duplex = -1;354 }355 ax->link = phy_dev->link;356 357 status_change = 1;358 }359 360 if (status_change)361 phy_print_status(phy_dev);362}363 364static int ax_mii_probe(struct net_device *dev)365{366 struct ax_device *ax = to_ax_dev(dev);367 struct phy_device *phy_dev = NULL;368 int ret;369 370 /* find the first phy */371 phy_dev = phy_find_first(ax->mii_bus);372 if (!phy_dev) {373 netdev_err(dev, "no PHY found\n");374 return -ENODEV;375 }376 377 ret = phy_connect_direct(dev, phy_dev, ax_handle_link_change,378 PHY_INTERFACE_MODE_MII);379 if (ret) {380 netdev_err(dev, "Could not attach to PHY\n");381 return ret;382 }383 384 phy_set_max_speed(phy_dev, SPEED_100);385 386 netdev_info(dev, "PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n",387 phy_dev->drv->name, phydev_name(phy_dev), phy_dev->irq);388 389 return 0;390}391 392static void ax_phy_switch(struct net_device *dev, int on)393{394 struct ei_device *ei_local = netdev_priv(dev);395 struct ax_device *ax = to_ax_dev(dev);396 397 u8 reg_gpoc = ax->plat->gpoc_val;398 399 if (!!on)400 reg_gpoc &= ~AX_GPOC_PPDSET;401 else402 reg_gpoc |= AX_GPOC_PPDSET;403 404 ei_outb(reg_gpoc, ei_local->mem + EI_SHIFT(0x17));405}406 407static void ax_bb_mdc(struct mdiobb_ctrl *ctrl, int level)408{409 struct ax_device *ax = container_of(ctrl, struct ax_device, bb_ctrl);410 411 if (level)412 ax->reg_memr |= AX_MEMR_MDC;413 else414 ax->reg_memr &= ~AX_MEMR_MDC;415 416 ei_outb(ax->reg_memr, ax->addr_memr);417}418 419static void ax_bb_dir(struct mdiobb_ctrl *ctrl, int output)420{421 struct ax_device *ax = container_of(ctrl, struct ax_device, bb_ctrl);422 423 if (output)424 ax->reg_memr &= ~AX_MEMR_MDIR;425 else426 ax->reg_memr |= AX_MEMR_MDIR;427 428 ei_outb(ax->reg_memr, ax->addr_memr);429}430 431static void ax_bb_set_data(struct mdiobb_ctrl *ctrl, int value)432{433 struct ax_device *ax = container_of(ctrl, struct ax_device, bb_ctrl);434 435 if (value)436 ax->reg_memr |= AX_MEMR_MDO;437 else438 ax->reg_memr &= ~AX_MEMR_MDO;439 440 ei_outb(ax->reg_memr, ax->addr_memr);441}442 443static int ax_bb_get_data(struct mdiobb_ctrl *ctrl)444{445 struct ax_device *ax = container_of(ctrl, struct ax_device, bb_ctrl);446 int reg_memr = ei_inb(ax->addr_memr);447 448 return reg_memr & AX_MEMR_MDI ? 1 : 0;449}450 451static const struct mdiobb_ops bb_ops = {452 .owner = THIS_MODULE,453 .set_mdc = ax_bb_mdc,454 .set_mdio_dir = ax_bb_dir,455 .set_mdio_data = ax_bb_set_data,456 .get_mdio_data = ax_bb_get_data,457};458 459static int ax_mii_init(struct net_device *dev)460{461 struct platform_device *pdev = to_platform_device(dev->dev.parent);462 struct ei_device *ei_local = netdev_priv(dev);463 struct ax_device *ax = to_ax_dev(dev);464 int err;465 466 ax->bb_ctrl.ops = &bb_ops;467 ax->addr_memr = ei_local->mem + AX_MEMR;468 ax->mii_bus = alloc_mdio_bitbang(&ax->bb_ctrl);469 if (!ax->mii_bus) {470 err = -ENOMEM;471 goto out;472 }473 474 ax->mii_bus->name = "ax88796_mii_bus";475 ax->mii_bus->parent = dev->dev.parent;476 snprintf(ax->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x",477 pdev->name, pdev->id);478 479 err = mdiobus_register(ax->mii_bus);480 if (err)481 goto out_free_mdio_bitbang;482 483 return 0;484 485 out_free_mdio_bitbang:486 free_mdio_bitbang(ax->mii_bus);487 out:488 return err;489}490 491static int ax_open(struct net_device *dev)492{493 struct ax_device *ax = to_ax_dev(dev);494 int ret;495 496 netdev_dbg(dev, "open\n");497 498 ret = ax_mii_init(dev);499 if (ret)500 goto failed_mii;501 502 if (ax->plat->check_irq)503 ret = request_irq(dev->irq, ax_ei_interrupt_filtered,504 ax->irqflags, dev->name, dev);505 else506 ret = request_irq(dev->irq, ax_ei_interrupt, ax->irqflags,507 dev->name, dev);508 if (ret)509 goto failed_request_irq;510 511 /* turn the phy on (if turned off) */512 ax_phy_switch(dev, 1);513 514 ret = ax_mii_probe(dev);515 if (ret)516 goto failed_mii_probe;517 phy_start(dev->phydev);518 519 ret = ax_ei_open(dev);520 if (ret)521 goto failed_ax_ei_open;522 523 ax->running = 1;524 525 return 0;526 527 failed_ax_ei_open:528 phy_disconnect(dev->phydev);529 failed_mii_probe:530 ax_phy_switch(dev, 0);531 free_irq(dev->irq, dev);532 failed_request_irq:533 /* unregister mdiobus */534 mdiobus_unregister(ax->mii_bus);535 free_mdio_bitbang(ax->mii_bus);536 failed_mii:537 return ret;538}539 540static int ax_close(struct net_device *dev)541{542 struct ax_device *ax = to_ax_dev(dev);543 544 netdev_dbg(dev, "close\n");545 546 ax->running = 0;547 wmb();548 549 ax_ei_close(dev);550 551 /* turn the phy off */552 ax_phy_switch(dev, 0);553 phy_disconnect(dev->phydev);554 555 free_irq(dev->irq, dev);556 557 mdiobus_unregister(ax->mii_bus);558 free_mdio_bitbang(ax->mii_bus);559 return 0;560}561 562static int ax_ioctl(struct net_device *dev, struct ifreq *req, int cmd)563{564 struct phy_device *phy_dev = dev->phydev;565 566 if (!netif_running(dev))567 return -EINVAL;568 569 if (!phy_dev)570 return -ENODEV;571 572 return phy_mii_ioctl(phy_dev, req, cmd);573}574 575/* ethtool ops */576 577static void ax_get_drvinfo(struct net_device *dev,578 struct ethtool_drvinfo *info)579{580 struct platform_device *pdev = to_platform_device(dev->dev.parent);581 582 strscpy(info->driver, DRV_NAME, sizeof(info->driver));583 strscpy(info->version, DRV_VERSION, sizeof(info->version));584 strscpy(info->bus_info, pdev->name, sizeof(info->bus_info));585}586 587static u32 ax_get_msglevel(struct net_device *dev)588{589 struct ei_device *ei_local = netdev_priv(dev);590 591 return ei_local->msg_enable;592}593 594static void ax_set_msglevel(struct net_device *dev, u32 v)595{596 struct ei_device *ei_local = netdev_priv(dev);597 598 ei_local->msg_enable = v;599}600 601static const struct ethtool_ops ax_ethtool_ops = {602 .get_drvinfo = ax_get_drvinfo,603 .get_link = ethtool_op_get_link,604 .get_ts_info = ethtool_op_get_ts_info,605 .get_msglevel = ax_get_msglevel,606 .set_msglevel = ax_set_msglevel,607 .get_link_ksettings = phy_ethtool_get_link_ksettings,608 .set_link_ksettings = phy_ethtool_set_link_ksettings,609};610 611#ifdef CONFIG_AX88796_93CX6612static void ax_eeprom_register_read(struct eeprom_93cx6 *eeprom)613{614 struct ei_device *ei_local = eeprom->data;615 u8 reg = ei_inb(ei_local->mem + AX_MEMR);616 617 eeprom->reg_data_in = reg & AX_MEMR_EEI;618 eeprom->reg_data_out = reg & AX_MEMR_EEO; /* Input pin */619 eeprom->reg_data_clock = reg & AX_MEMR_EECLK;620 eeprom->reg_chip_select = reg & AX_MEMR_EECS;621}622 623static void ax_eeprom_register_write(struct eeprom_93cx6 *eeprom)624{625 struct ei_device *ei_local = eeprom->data;626 u8 reg = ei_inb(ei_local->mem + AX_MEMR);627 628 reg &= ~(AX_MEMR_EEI | AX_MEMR_EECLK | AX_MEMR_EECS);629 630 if (eeprom->reg_data_in)631 reg |= AX_MEMR_EEI;632 if (eeprom->reg_data_clock)633 reg |= AX_MEMR_EECLK;634 if (eeprom->reg_chip_select)635 reg |= AX_MEMR_EECS;636 637 ei_outb(reg, ei_local->mem + AX_MEMR);638 udelay(10);639}640#endif641 642static const struct net_device_ops ax_netdev_ops = {643 .ndo_open = ax_open,644 .ndo_stop = ax_close,645 .ndo_eth_ioctl = ax_ioctl,646 647 .ndo_start_xmit = ax_ei_start_xmit,648 .ndo_tx_timeout = ax_ei_tx_timeout,649 .ndo_get_stats = ax_ei_get_stats,650 .ndo_set_rx_mode = ax_ei_set_multicast_list,651 .ndo_validate_addr = eth_validate_addr,652 .ndo_set_mac_address = eth_mac_addr,653#ifdef CONFIG_NET_POLL_CONTROLLER654 .ndo_poll_controller = ax_ei_poll,655#endif656};657 658/* setup code */659 660static void ax_initial_setup(struct net_device *dev, struct ei_device *ei_local)661{662 void __iomem *ioaddr = ei_local->mem;663 struct ax_device *ax = to_ax_dev(dev);664 665 /* Select page 0 */666 ei_outb(E8390_NODMA + E8390_PAGE0 + E8390_STOP, ioaddr + E8390_CMD);667 668 /* set to byte access */669 ei_outb(ax->plat->dcr_val & ~1, ioaddr + EN0_DCFG);670 ei_outb(ax->plat->gpoc_val, ioaddr + EI_SHIFT(0x17));671}672 673/*674 * ax_init_dev675 *676 * initialise the specified device, taking care to note the MAC677 * address it may already have (if configured), ensure678 * the device is ready to be used by lib8390.c and registerd with679 * the network layer.680 */681static int ax_init_dev(struct net_device *dev)682{683 struct ei_device *ei_local = netdev_priv(dev);684 struct ax_device *ax = to_ax_dev(dev);685 void __iomem *ioaddr = ei_local->mem;686 unsigned int start_page;687 unsigned int stop_page;688 int ret;689 int i;690 691 ret = ax_initial_check(dev);692 if (ret)693 goto err_out;694 695 /* setup goes here */696 697 ax_initial_setup(dev, ei_local);698 699 /* read the mac from the card prom if we need it */700 701 if (ax->plat->flags & AXFLG_HAS_EEPROM) {702 unsigned char SA_prom[32];703 704 ei_outb(6, ioaddr + EN0_RCNTLO);705 ei_outb(0, ioaddr + EN0_RCNTHI);706 ei_outb(0, ioaddr + EN0_RSARLO);707 ei_outb(0, ioaddr + EN0_RSARHI);708 ei_outb(E8390_RREAD + E8390_START, ioaddr + NE_CMD);709 for (i = 0; i < sizeof(SA_prom); i += 2) {710 SA_prom[i] = ei_inb(ioaddr + NE_DATAPORT);711 SA_prom[i + 1] = ei_inb(ioaddr + NE_DATAPORT);712 }713 ei_outb(ENISR_RDC, ioaddr + EN0_ISR); /* Ack intr. */714 715 if (ax->plat->wordlength == 2)716 for (i = 0; i < 16; i++)717 SA_prom[i] = SA_prom[i+i];718 719 eth_hw_addr_set(dev, SA_prom);720 }721 722#ifdef CONFIG_AX88796_93CX6723 if (ax->plat->flags & AXFLG_HAS_93CX6) {724 unsigned char mac_addr[ETH_ALEN];725 struct eeprom_93cx6 eeprom;726 727 eeprom.data = ei_local;728 eeprom.register_read = ax_eeprom_register_read;729 eeprom.register_write = ax_eeprom_register_write;730 eeprom.width = PCI_EEPROM_WIDTH_93C56;731 732 eeprom_93cx6_multiread(&eeprom, 0,733 (__le16 __force *)mac_addr,734 sizeof(mac_addr) >> 1);735 736 eth_hw_addr_set(dev, mac_addr);737 }738#endif739 if (ax->plat->wordlength == 2) {740 /* We must set the 8390 for word mode. */741 ei_outb(ax->plat->dcr_val, ei_local->mem + EN0_DCFG);742 start_page = NESM_START_PG;743 stop_page = NESM_STOP_PG;744 } else {745 start_page = NE1SM_START_PG;746 stop_page = NE1SM_STOP_PG;747 }748 749 /* load the mac-address from the device */750 if (ax->plat->flags & AXFLG_MAC_FROMDEV) {751 u8 addr[ETH_ALEN];752 753 ei_outb(E8390_NODMA + E8390_PAGE1 + E8390_STOP,754 ei_local->mem + E8390_CMD); /* 0x61 */755 for (i = 0; i < ETH_ALEN; i++)756 addr[i] = ei_inb(ioaddr + EN1_PHYS_SHIFT(i));757 eth_hw_addr_set(dev, addr);758 }759 760 if ((ax->plat->flags & AXFLG_MAC_FROMPLATFORM) &&761 ax->plat->mac_addr)762 eth_hw_addr_set(dev, ax->plat->mac_addr);763 764 if (!is_valid_ether_addr(dev->dev_addr)) {765 eth_hw_addr_random(dev);766 dev_info(&dev->dev, "Using random MAC address: %pM\n",767 dev->dev_addr);768 }769 770 ax_reset_8390(dev);771 772 ei_local->name = "AX88796";773 ei_local->tx_start_page = start_page;774 ei_local->stop_page = stop_page;775 ei_local->word16 = (ax->plat->wordlength == 2);776 ei_local->rx_start_page = start_page + TX_PAGES;777 778#ifdef PACKETBUF_MEMSIZE779 /* Allow the packet buffer size to be overridden by know-it-alls. */780 ei_local->stop_page = ei_local->tx_start_page + PACKETBUF_MEMSIZE;781#endif782 783 ei_local->reset_8390 = &ax_reset_8390;784 if (ax->plat->block_input)785 ei_local->block_input = ax->plat->block_input;786 else787 ei_local->block_input = &ax_block_input;788 if (ax->plat->block_output)789 ei_local->block_output = ax->plat->block_output;790 else791 ei_local->block_output = &ax_block_output;792 ei_local->get_8390_hdr = &ax_get_8390_hdr;793 ei_local->priv = 0;794 795 dev->netdev_ops = &ax_netdev_ops;796 dev->ethtool_ops = &ax_ethtool_ops;797 798 ax_NS8390_init(dev, 0);799 800 ret = register_netdev(dev);801 if (ret)802 goto err_out;803 804 netdev_info(dev, "%dbit, irq %d, %lx, MAC: %pM\n",805 ei_local->word16 ? 16 : 8, dev->irq, dev->base_addr,806 dev->dev_addr);807 808 return 0;809 810 err_out:811 return ret;812}813 814static void ax_remove(struct platform_device *pdev)815{816 struct net_device *dev = platform_get_drvdata(pdev);817 struct ei_device *ei_local = netdev_priv(dev);818 struct ax_device *ax = to_ax_dev(dev);819 struct resource *mem;820 821 unregister_netdev(dev);822 823 iounmap(ei_local->mem);824 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);825 release_mem_region(mem->start, resource_size(mem));826 827 if (ax->map2) {828 iounmap(ax->map2);829 mem = platform_get_resource(pdev, IORESOURCE_MEM, 1);830 release_mem_region(mem->start, resource_size(mem));831 }832 833 platform_set_drvdata(pdev, NULL);834 free_netdev(dev);835}836 837/*838 * ax_probe839 *840 * This is the entry point when the platform device system uses to841 * notify us of a new device to attach to. Allocate memory, find the842 * resources and information passed, and map the necessary registers.843 */844static int ax_probe(struct platform_device *pdev)845{846 struct net_device *dev;847 struct ei_device *ei_local;848 struct ax_device *ax;849 struct resource *irq, *mem, *mem2;850 unsigned long mem_size, mem2_size = 0;851 int ret = 0;852 853 dev = ax__alloc_ei_netdev(sizeof(struct ax_device));854 if (dev == NULL)855 return -ENOMEM;856 857 /* ok, let's setup our device */858 SET_NETDEV_DEV(dev, &pdev->dev);859 ei_local = netdev_priv(dev);860 ax = to_ax_dev(dev);861 862 ax->plat = dev_get_platdata(&pdev->dev);863 platform_set_drvdata(pdev, dev);864 865 ei_local->rxcr_base = ax->plat->rcr_val;866 867 /* find the platform resources */868 irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);869 if (!irq) {870 dev_err(&pdev->dev, "no IRQ specified\n");871 ret = -ENXIO;872 goto exit_mem;873 }874 875 dev->irq = irq->start;876 ax->irqflags = irq->flags & IRQF_TRIGGER_MASK;877 878 if (irq->flags & IORESOURCE_IRQ_SHAREABLE)879 ax->irqflags |= IRQF_SHARED;880 881 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);882 if (!mem) {883 dev_err(&pdev->dev, "no MEM specified\n");884 ret = -ENXIO;885 goto exit_mem;886 }887 888 mem_size = resource_size(mem);889 890 /*891 * setup the register offsets from either the platform data or892 * by using the size of the resource provided893 */894 if (ax->plat->reg_offsets)895 ei_local->reg_offset = ax->plat->reg_offsets;896 else {897 ei_local->reg_offset = ax->reg_offsets;898 for (ret = 0; ret < 0x18; ret++)899 ax->reg_offsets[ret] = (mem_size / 0x18) * ret;900 }901 902 if (!request_mem_region(mem->start, mem_size, pdev->name)) {903 dev_err(&pdev->dev, "cannot reserve registers\n");904 ret = -ENXIO;905 goto exit_mem;906 }907 908 ei_local->mem = ioremap(mem->start, mem_size);909 dev->base_addr = (unsigned long)ei_local->mem;910 911 if (ei_local->mem == NULL) {912 dev_err(&pdev->dev, "Cannot ioremap area %pR\n", mem);913 914 ret = -ENXIO;915 goto exit_req;916 }917 918 /* look for reset area */919 mem2 = platform_get_resource(pdev, IORESOURCE_MEM, 1);920 if (!mem2) {921 if (!ax->plat->reg_offsets) {922 for (ret = 0; ret < 0x20; ret++)923 ax->reg_offsets[ret] = (mem_size / 0x20) * ret;924 }925 } else {926 mem2_size = resource_size(mem2);927 928 if (!request_mem_region(mem2->start, mem2_size, pdev->name)) {929 dev_err(&pdev->dev, "cannot reserve registers\n");930 ret = -ENXIO;931 goto exit_mem1;932 }933 934 ax->map2 = ioremap(mem2->start, mem2_size);935 if (!ax->map2) {936 dev_err(&pdev->dev, "cannot map reset register\n");937 ret = -ENXIO;938 goto exit_mem2;939 }940 941 ei_local->reg_offset[0x1f] = ax->map2 - ei_local->mem;942 }943 944 /* got resources, now initialise and register device */945 ret = ax_init_dev(dev);946 if (!ret)947 return 0;948 949 if (!ax->map2)950 goto exit_mem1;951 952 iounmap(ax->map2);953 954 exit_mem2:955 if (mem2)956 release_mem_region(mem2->start, mem2_size);957 958 exit_mem1:959 iounmap(ei_local->mem);960 961 exit_req:962 release_mem_region(mem->start, mem_size);963 964 exit_mem:965 platform_set_drvdata(pdev, NULL);966 free_netdev(dev);967 968 return ret;969}970 971/* suspend and resume */972 973#ifdef CONFIG_PM974static int ax_suspend(struct platform_device *dev, pm_message_t state)975{976 struct net_device *ndev = platform_get_drvdata(dev);977 struct ax_device *ax = to_ax_dev(ndev);978 979 ax->resume_open = ax->running;980 981 netif_device_detach(ndev);982 ax_close(ndev);983 984 return 0;985}986 987static int ax_resume(struct platform_device *pdev)988{989 struct net_device *ndev = platform_get_drvdata(pdev);990 struct ax_device *ax = to_ax_dev(ndev);991 992 ax_initial_setup(ndev, netdev_priv(ndev));993 ax_NS8390_init(ndev, ax->resume_open);994 netif_device_attach(ndev);995 996 if (ax->resume_open)997 ax_open(ndev);998 999 return 0;1000}1001 1002#else1003#define ax_suspend NULL1004#define ax_resume NULL1005#endif1006 1007static struct platform_driver axdrv = {1008 .driver = {1009 .name = "ax88796",1010 },1011 .probe = ax_probe,1012 .remove_new = ax_remove,1013 .suspend = ax_suspend,1014 .resume = ax_resume,1015};1016 1017module_platform_driver(axdrv);1018 1019MODULE_DESCRIPTION("AX88796 10/100 Ethernet platform driver");1020MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");1021MODULE_LICENSE("GPL v2");1022MODULE_ALIAS("platform:ax88796");1023