* gt96100_cleanup_module(), and other general code cleanups
* <stevel@mvista.com>.
*/
-#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/skbuff.h>
#include <linux/delay.h>
#include <linux/ctype.h>
+#include <linux/bitops.h>
#include <asm/irq.h>
-#include <asm/bitops.h>
#include <asm/io.h>
#define DESC_BE 1
static void read_mib_counters(struct gt96100_private *gp);
static int read_MII(int phy_addr, u32 reg);
static int write_MII(int phy_addr, u32 reg, u16 data);
-#if 0
-static void dump_tx_ring(struct net_device *dev);
-static void dump_rx_ring(struct net_device *dev);
-#endif
static int gt96100_init_module(void);
static void gt96100_cleanup_module(void);
static void dump_MII(int dbg_lvl, struct net_device *dev);
static void hard_stop(struct net_device *dev);
static void enable_ether_irq(struct net_device *dev);
static void disable_ether_irq(struct net_device *dev);
-static int gt96100_probe1(int port_num);
+static int gt96100_probe1(struct pci_dev *pci, int port_num);
static void reset_tx(struct net_device *dev);
static void reset_rx(struct net_device *dev);
static int gt96100_check_tx_consistent(struct gt96100_private *gp);
/*
DMA memory allocation, derived from pci_alloc_consistent.
*/
-static void *
-dmaalloc(size_t size, dma_addr_t *dma_handle)
+static void * dmaalloc(size_t size, dma_addr_t *dma_handle)
{
void *ret;
- ret = (void *)__get_free_pages(GFP_ATOMIC | GFP_DMA,
- get_order(size));
+ ret = (void *)__get_free_pages(GFP_ATOMIC | GFP_DMA, get_order(size));
if (ret != NULL) {
dma_cache_inv((unsigned long)ret, size);
return ret;
}
-static void
-dmafree(size_t size, void *vaddr)
+static void dmafree(size_t size, void *vaddr)
{
vaddr = (void*)KSEG0ADDR(vaddr);
free_pages((unsigned long)vaddr, get_order(size));
}
-
-
-static void
-gt96100_delay(int ms)
+static void gt96100_delay(int ms)
{
if (in_interrupt())
return;
- else {
- current->state = TASK_INTERRUPTIBLE;
- schedule_timeout(ms*HZ/1000);
- }
+ else
+ msleep_interruptible(ms);
}
static int
return 0;
}
-#if 0
-// These routines work, just disabled to avoid compile warnings
-static void
-dump_tx_ring(struct net_device *dev)
-{
- struct gt96100_private *gp = netdev_priv(dev);
- int i;
-
- dbg(0, "%s: txno/txni/cnt=%d/%d/%d\n", __FUNCTION__,
- gp->tx_next_out, gp->tx_next_in, gp->tx_count);
-
- for (i=0; i<TX_RING_SIZE; i++)
- dump_tx_desc(0, dev, i);
-}
-
-static void
-dump_rx_ring(struct net_device *dev)
-{
- struct gt96100_private *gp = netdev_priv(dev);
- int i;
-
- dbg(0, "%s: rxno=%d\n", __FUNCTION__, gp->rx_next_out);
-
- for (i=0; i<RX_RING_SIZE; i++)
- dump_rx_desc(0, dev, i);
-}
-#endif
-
static void
dump_MII(int dbg_lvl, struct net_device *dev)
{
// wait for abort to complete
while (GT96100ETH_READ(gp, GT96100_ETH_SDMA_COMM) & abort_bits) {
- // snooze for 20 msec and check again
+ // snooze for 1 msec and check again
gt96100_delay(1);
if (--timedout == 0) {
/*
* Init GT96100 ethernet controller driver
*/
-int gt96100_init_module(void)
+static int gt96100_init_module(void)
{
+ struct pci_dev *pci;
int i, retval=0;
- u16 vendor_id, device_id;
u32 cpuConfig;
-#ifndef CONFIG_MIPS_GT96100ETH
- return -ENODEV;
-#endif
-
- // probe for GT96100 by reading PCI0 vendor/device ID register
- pcibios_read_config_word(0, 0, PCI_VENDOR_ID, &vendor_id);
- pcibios_read_config_word(0, 0, PCI_DEVICE_ID, &device_id);
-
- if (vendor_id != PCI_VENDOR_ID_MARVELL ||
- (device_id != PCI_DEVICE_ID_MARVELL_GT96100 &&
- device_id != PCI_DEVICE_ID_MARVELL_GT96100A)) {
+ /*
+ * Stupid probe because this really isn't a PCI device
+ */
+ if (!(pci = pci_find_device(PCI_VENDOR_ID_MARVELL,
+ PCI_DEVICE_ID_MARVELL_GT96100, NULL)) &&
+ !(pci = pci_find_device(PCI_VENDOR_ID_MARVELL,
+ PCI_DEVICE_ID_MARVELL_GT96100A, NULL))) {
printk(KERN_ERR __FILE__ ": GT96100 not found!\n");
return -ENODEV;
}
return -ENODEV;
}
- for (i=0; i < NUM_INTERFACES; i++) {
- retval |= gt96100_probe1(i);
- }
+ for (i=0; i < NUM_INTERFACES; i++)
+ retval |= gt96100_probe1(pci, i);
return retval;
}
-
-
-static int __init
-gt96100_probe1(int port_num)
+static int __init gt96100_probe1(struct pci_dev *pci, int port_num)
{
struct gt96100_private *gp = NULL;
struct gt96100_if_t *gtif = >96100_iflist[port_num];
struct net_device *dev = NULL;
if (gtif->irq < 0) {
- printk(KERN_ERR "%s: irq unknown - probing not supported\n", __FUNCTION_);
+ printk(KERN_ERR "%s: irq unknown - probing not supported\n",
+ __FUNCTION__);
return -ENODEV;
}
- pcibios_read_config_byte(0, 0, PCI_REVISION_ID, &chip_rev);
+ pci_read_config_byte(pci, PCI_REVISION_ID, &chip_rev);
if (chip_rev >= REV_GT96100A_1) {
phyAD = GT96100_READ(GT96100_ETH_PHY_ADDR_REG);
phy_addr = (phyAD >> (5*port_num)) & 0x1f;
} else {
/*
- * not sure what's this about -- probably
- * a gt bug
+ * not sure what's this about -- probably a gt bug
*/
phy_addr = port_num;
phyAD = GT96100_READ(GT96100_ETH_PHY_ADDR_REG);
free_netdev (dev);
out:
release_region(gtif->iobase, GT96100_ETH_IO_SIZE);
+
err("%s failed. Returns %d\n", __FUNCTION__, retval);
return retval;
}
}
free_irq(dev->irq, dev);
+
return 0;
}
cmdstat, nextOut);
if (cmdstat & (u32)txOwn) {
- //dump_tx_ring(dev);
- // DMA is not finished writing descriptor???
- // Leave and come back later to pick-up where
- // we left off.
+ /*
+ * DMA is not finished writing descriptor???
+ * Leave and come back later to pick-up where
+ * we left off.
+ */
break;
}
gp->tx_full = 0;
if (gp->last_psr & psrLink) {
netif_wake_queue(dev);
- dbg(2, "%s: Tx Ring was full, queue waked\n", __FUNCTION_);
+ dbg(2, "%s: Tx Ring was full, queue waked\n",
+ __FUNCTION__);
}
}
if ((psr & psrLink) && !gp->tx_full &&
netif_queue_stopped(dev)) {
- dbg(0, ": Link up, waking queue.\n",
- __FUNCTION_);
+ dbg(0, "%s: Link up, waking queue.\n",
+ __FUNCTION__);
netif_wake_queue(dev);
} else if (!(psr & psrLink) &&
!netif_queue_stopped(dev)) {
- dbg(0, "Link down, stopping queue.\n",
+ dbg(0, "%s: Link down, stopping queue.\n",
__FUNCTION__);
netif_stop_queue(dev);
}
for (i=0; i<NUM_INTERFACES; i++) {
struct gt96100_if_t *gtif = >96100_iflist[i];
if (gtif->dev != NULL) {
- struct gt96100_private *gp =
- (struct gt96100_private *)gtif->dev->priv;
+ struct gt96100_private *gp = (struct gt96100_private *)
+ netdev_priv(gtif->dev);
unregister_netdev(gtif->dev);
dmafree(RX_HASH_TABLE_SIZE, gp->hash_table_dma);
dmafree(PKT_BUF_SZ*RX_RING_SIZE, gp->rx_buff);
}
}
-
-#ifndef MODULE
-
static int __init gt96100_setup(char *options)
{
char *this_opt;
__setup("gt96100eth=", gt96100_setup);
-#endif /* !MODULE */
-
-
module_init(gt96100_init_module);
module_exit(gt96100_cleanup_module);