202 #include <linux/bitops.h>
203 #include <linux/compiler.h>
207 #include <linux/errno.h>
212 #include <linux/kernel.h>
213 #include <linux/module.h>
214 #include <linux/netdevice.h>
215 #include <linux/pci.h>
217 #include <linux/slab.h>
218 #include <linux/string.h>
221 #include <asm/byteorder.h>
227 #define DRV_NAME "defxx"
228 #define DRV_VERSION "v1.10"
229 #define DRV_RELDATE "2006/12/14"
233 " Lawrence V. Stefani and others\n";
235 #define DYNAMIC_BUFFERS 1
237 #define SKBUFF_RX_COPYBREAK 200
242 #define NEW_SKB_SIZE (PI_RCV_DATA_K_SIZE_MAX+128)
245 #define DFX_BUS_PCI(dev) (dev->bus == &pci_bus_type)
247 #define DFX_BUS_PCI(dev) 0
251 #define DFX_BUS_EISA(dev) (dev->bus == &eisa_bus_type)
253 #define DFX_BUS_EISA(dev) 0
257 #define DFX_BUS_TC(dev) (dev->bus == &tc_bus_type)
259 #define DFX_BUS_TC(dev) 0
262 #ifdef CONFIG_DEFXX_MMIO
275 const char *print_name,
277 static int dfx_adap_init(
DFX_board_t *bp,
int get_buffers);
283 static void dfx_int_type_0_process(
DFX_board_t *bp);
288 static void dfx_ctl_set_multicast_list(
struct net_device *
dev);
291 static int dfx_ctl_update_filters(
DFX_board_t *bp);
299 static int dfx_rcv_init(
DFX_board_t *bp,
int get_buffers);
300 static void dfx_rcv_queue_process(
DFX_board_t *bp);
380 int dfx_use_mmio =
DFX_MMIO || dfx_bus_tc;
383 dfx_writel(bp, offset, data);
385 dfx_outl(bp, offset, data);
389 static inline void dfx_readl(
DFX_board_t *bp,
int offset,
u32 *data)
395 static inline void dfx_inl(
DFX_board_t *bp,
int offset,
u32 *data)
400 static void dfx_port_read_long(
DFX_board_t *bp,
int offset,
u32 *data)
404 int dfx_use_mmio =
DFX_MMIO || dfx_bus_tc;
407 dfx_readl(bp, offset, data);
409 dfx_inl(bp, offset, data);
436 static void dfx_get_bars(
struct device *bdev,
442 int dfx_use_mmio =
DFX_MMIO || dfx_bus_tc;
445 int num = dfx_use_mmio ? 0 : 1;
470 *bar_start = base_addr;
475 *bar_start =
to_tc_dev(bdev)->resource.start +
482 .ndo_open = dfx_open,
483 .ndo_stop = dfx_close,
484 .ndo_start_xmit = dfx_xmt_queue_pkt,
485 .ndo_get_stats = dfx_ctl_get_stats,
486 .ndo_set_rx_mode = dfx_ctl_set_multicast_list,
487 .ndo_set_mac_address = dfx_ctl_set_mac_address,
520 static int version_disp;
523 int dfx_use_mmio =
DFX_MMIO || dfx_bus_tc;
524 const char *print_name = dev_name(bdev);
554 bp = netdev_priv(dev);
558 dfx_get_bars(bdev, &bar_start, &bar_len);
566 "0x%lx @ 0x%lx, aborting\n",
567 print_name, (
long)bar_len, (
long)bar_start);
569 goto err_out_disable;
591 if (dfx_driver_init(dev, print_name, bar_start) !=
DFX_K_SUCCESS) {
600 printk(
"%s: registered as %s\n", print_name, dev->
name);
673 int dfx_use_mmio =
DFX_MMIO || dfx_bus_tc;
893 status = dfx_hw_port_ctrl_req(bp,
966 const char *print_name,
974 int dfx_use_mmio =
DFX_MMIO || dfx_bus_tc;
976 char *top_v, *curr_v;
980 char *board_name =
NULL;
1011 dfx_bus_config_check(bp);
1025 printk(
"%s: Could not read adapter factory MAC address!\n",
1034 printk(
"%s: Could not read adapter factory MAC address!\n",
1050 board_name =
"DEFTA";
1052 board_name =
"DEFEA";
1054 board_name =
"DEFPA";
1055 pr_info(
"%s: %s at %saddr = 0x%llx, IRQ = %d, Hardware addr = %pMF\n",
1056 print_name, board_name, dfx_use_mmio ?
"" :
"I/O ",
1075 if (top_v ==
NULL) {
1076 printk(
"%s: Could not allocate memory for host buffers "
1077 "and structures!\n", print_name);
1080 memset(top_v, 0, alloc_size);
1096 curr_v = top_v + (curr_p - top_p);
1124 #ifndef DYNAMIC_BUFFERS
1136 DBG_printk(
"%s: Descriptor block virt = %0lX, phys = %0X\n",
1139 DBG_printk(
"%s: Command Request buffer virt = %0lX, phys = %0X\n",
1141 DBG_printk(
"%s: Command Response buffer virt = %0lX, phys = %0X\n",
1143 DBG_printk(
"%s: Receive buffer block virt = %0lX, phys = %0X\n",
1145 DBG_printk(
"%s: Consumer block virt = %0lX, phys = %0X\n",
1185 static int dfx_adap_init(
DFX_board_t *bp,
int get_buffers)
1197 printk(
"%s: Could not uninitialize/reset adapter!\n", bp->
dev->name);
1225 if (dfx_hw_port_ctrl_req(bp,
1231 printk(
"%s: Could not set adapter burst size!\n", bp->
dev->name);
1242 if (dfx_hw_port_ctrl_req(bp,
1248 printk(
"%s: Could not set consumer block address!\n", bp->
dev->name);
1266 printk(
"%s: Could not set descriptor block address!\n",
1280 printk(
"%s: DMA command request failed!\n", bp->
dev->name);
1296 printk(
"%s: DMA command request failed!\n", bp->
dev->name);
1304 printk(
"%s: Adapter CAM update failed!\n", bp->
dev->name);
1312 printk(
"%s: Adapter filters update failed!\n", bp->
dev->name);
1326 if (dfx_rcv_init(bp, get_buffers))
1328 printk(
"%s: Receive buffer allocation failed\n", bp->
dev->name);
1339 printk(
"%s: Start command failed\n", bp->
dev->name);
1436 netif_start_queue(dev);
1523 netif_stop_queue(dev);
1575 printk(
"%s: Halt ID: Selftest Timeout\n", bp->
dev->name);
1579 printk(
"%s: Halt ID: Host Bus Parity Error\n", bp->
dev->name);
1583 printk(
"%s: Halt ID: Host-Directed Halt\n", bp->
dev->name);
1587 printk(
"%s: Halt ID: Adapter Software Fault\n", bp->
dev->name);
1591 printk(
"%s: Halt ID: Adapter Hardware Fault\n", bp->
dev->name);
1595 printk(
"%s: Halt ID: FDDI Network PC Trace Path Test\n", bp->
dev->name);
1599 printk(
"%s: Halt ID: Adapter DMA Error\n", bp->
dev->name);
1603 printk(
"%s: Halt ID: Firmware Image CRC Error\n", bp->
dev->name);
1607 printk(
"%s: Halt ID: 68000 Bus Exception\n", bp->
dev->name);
1611 printk(
"%s: Halt ID: Unknown (code = %X)\n", bp->
dev->name, halt_id);
1664 static void dfx_int_type_0_process(
DFX_board_t *bp)
1688 printk(
"%s: Non-Existent Memory Access Error\n", bp->
dev->name);
1693 printk(
"%s: Packet Memory Parity Error\n", bp->
dev->name);
1698 printk(
"%s: Host Bus Parity Error\n", bp->
dev->name);
1704 printk(
"%s: Resetting adapter...\n", bp->
dev->name);
1707 printk(
"%s: Adapter reset failed! Disabling adapter interrupts.\n", bp->
dev->name);
1711 printk(
"%s: Adapter reset successful!\n", bp->
dev->name);
1723 (
void) dfx_hw_port_ctrl_req(bp,
1736 state = dfx_hw_adap_state_rd(bp);
1745 printk(
"%s: Controller has transitioned to HALTED state!\n", bp->
dev->name);
1746 dfx_int_pr_halt_id(bp);
1752 printk(
"%s: Resetting adapter...\n", bp->
dev->name);
1755 printk(
"%s: Adapter reset failed! Disabling adapter interrupts.\n", bp->
dev->name);
1759 printk(
"%s: Adapter reset successful!\n", bp->
dev->name);
1809 static void dfx_int_common(
struct net_device *dev)
1816 if(dfx_xmt_done(bp))
1817 netif_wake_queue(dev);
1821 dfx_rcv_queue_process(bp);
1839 dfx_int_type_0_process(bp);
1897 spin_lock(&bp->
lock);
1904 dfx_int_common(dev);
1908 PFI_STATUS_M_PDQ_INT);
1913 spin_unlock(&bp->
lock);
1923 spin_lock(&bp->
lock);
1930 dfx_int_common(dev);
1937 spin_unlock(&bp->
lock);
1952 spin_lock(&bp->
lock);
1955 dfx_int_common(dev);
1957 spin_unlock(&bp->
lock);
2024 bp->
stats.gen.collisions = 0;
2194 static void dfx_ctl_set_multicast_list(
struct net_device *dev)
2246 ha->
addr, FDDI_K_ALEN);
2250 DBG_printk(
"%s: Could not update multicast address table!\n", dev->
name);
2262 DBG_printk(
"%s: Could not update adapter filters!\n", dev->
name);
2307 static int dfx_ctl_set_mac_address(
struct net_device *dev,
void *
addr)
2339 DBG_printk(
"%s: Could not update adapter filters!\n", dev->
name);
2355 DBG_printk(
"%s: Adapter CAM updated with new MAC address\n", dev->
name);
2477 static int dfx_ctl_update_filters(
DFX_board_t *bp)
2559 status = dfx_hw_adap_state_rd(bp);
2595 for (timeout_cnt = 20000; timeout_cnt > 0; timeout_cnt--)
2601 if (timeout_cnt == 0)
2615 for (timeout_cnt = 20000; timeout_cnt > 0; timeout_cnt--)
2621 if (timeout_cnt == 0)
2666 static int dfx_hw_port_ctrl_req(
2691 timeout_cnt = 600000;
2693 timeout_cnt = 20000;
2695 for (; timeout_cnt > 0; timeout_cnt--)
2702 if (timeout_cnt == 0)
2711 if (host_data !=
NULL)
2750 static void dfx_hw_adap_reset(
2844 dfx_hw_adap_reset(bp, type);
2848 for (timeout_cnt = 100000; timeout_cnt > 0; timeout_cnt--)
2854 if (timeout_cnt == 0)
2864 static void my_skb_align(
struct sk_buff *
skb,
int n)
2866 unsigned long x = (
unsigned long)skb->
data;
2871 skb_reserve(skb,
v - x);
2910 static int dfx_rcv_init(
DFX_board_t *bp,
int get_buffers)
2933 #ifdef DYNAMIC_BUFFERS
2947 my_skb_align(newskb, 128);
3010 static void dfx_rcv_queue_process(
3030 #ifdef DYNAMIC_BUFFERS
3046 int rx_in_place = 0;
3063 my_skb_align(newskb, 128);
3080 skb = dev_alloc_skb(pkt_len+3);
3083 printk(
"%s: Could not allocate receive buffer. Dropping packet.\n", bp->
dev->name);
3088 #ifndef DYNAMIC_BUFFERS
3094 skb_copy_to_linear_data(skb,
3195 unsigned long flags;
3197 netif_stop_queue(dev);
3210 printk(
"%s: Invalid packet length - %u bytes\n",
3213 netif_wake_queue(dev);
3237 netif_wake_queue(dev);
3314 spin_unlock_irqrestore(&bp->
lock, flags);
3340 spin_unlock_irqrestore(&bp->
lock, flags);
3341 netif_wake_queue(dev);
3403 p_xmt_drv_descr->
p_skb->len,
3451 #ifdef DYNAMIC_BUFFERS
3468 static inline void dfx_rcv_flush(
DFX_board_t *bp )
3527 p_xmt_drv_descr->
p_skb->len,
3529 dev_kfree_skb(p_xmt_drv_descr->
p_skb);
3588 int dfx_use_mmio =
DFX_MMIO || dfx_bus_tc;
3606 dfx_bus_uninit(dev);
3608 dfx_get_bars(bdev, &bar_start, &bar_len);
3638 .id_table = dfx_pci_table,
3639 .probe = dfx_pci_register,
3646 return dfx_register(&pdev->
dev);
3651 dfx_unregister(&pdev->
dev);
3666 .id_table = dfx_eisa_table,
3670 .probe = dfx_dev_register,
3678 {
"DEC ",
"PMAF-FA " },
3679 {
"DEC ",
"PMAF-FD " },
3680 {
"DEC ",
"PMAF-FS " },
3681 {
"DEC ",
"PMAF-FU " },
3686 static struct tc_driver dfx_tc_driver = {
3687 .id_table = dfx_tc_table,
3691 .probe = dfx_dev_register,
3701 status = dfx_register(dev);
3710 dfx_unregister(dev);
3719 status = pci_register_driver(&dfx_pci_driver);