#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/timer.h>
#include <linux/errno.h>
#include <linux/ioport.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/pci.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/init.h>
#include <linux/spinlock.h>
#include <linux/ethtool.h>
#include <linux/delay.h>
#include <linux/rtnetlink.h>
#include <linux/mii.h>
#include <linux/crc32.h>
#include <linux/bitops.h>
#include <linux/prefetch.h>
#include <asm/processor.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <linux/uaccess.h>
#define DRV_NAME …
#define DRV_VERSION …
#define DRV_RELDATE …
#define RX_OFFSET …
#define NATSEMI_DEF_MSG …
static int debug = …;
static int mtu;
static const int multicast_filter_limit = …;
static int rx_copybreak;
static int dspcfg_workaround = …;
#define MAX_UNITS …
static int options[MAX_UNITS];
static int full_duplex[MAX_UNITS];
#define TX_RING_SIZE …
#define TX_QUEUE_LEN …
#define RX_RING_SIZE …
#define TX_TIMEOUT …
#define NATSEMI_HW_TIMEOUT …
#define NATSEMI_TIMER_FREQ …
#define NATSEMI_PG0_NREGS …
#define NATSEMI_RFDR_NREGS …
#define NATSEMI_PG1_NREGS …
#define NATSEMI_NREGS …
#define NATSEMI_REGS_VER …
#define NATSEMI_REGS_SIZE …
#define NATSEMI_HEADERS …
#define NATSEMI_PADDING …
#define NATSEMI_LONGPKT …
#define NATSEMI_RX_LIMIT …
static const char version[] = …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;
module_param(mtu, int, 0);
module_param(debug, int, 0);
module_param(rx_copybreak, int, 0);
module_param(dspcfg_workaround, int, 0);
module_param_array(…);
module_param_array(…);
MODULE_PARM_DESC(…) …;
MODULE_PARM_DESC(…) …;
MODULE_PARM_DESC(…) …;
MODULE_PARM_DESC(…) …;
MODULE_PARM_DESC(…) …;
MODULE_PARM_DESC(…) …;
#define PHYID_AM79C874 …
enum { … };
enum { … };
static struct { … } natsemi_pci_info[] = …;
static const struct pci_device_id natsemi_pci_tbl[] = …;
MODULE_DEVICE_TABLE(pci, natsemi_pci_tbl);
enum register_offsets { … };
#define PMDCSR_VAL …
#define TSTDAT_VAL …
#define DSPCFG_VAL …
#define SDCFG_VAL …
#define DSPCFG_LOCK …
#define DSPCFG_COEF …
#define TSTDAT_FIXED …
enum pci_register_offsets { … };
enum ChipCmd_bits { … };
enum ChipConfig_bits { … };
enum EECtrl_bits { … };
enum PCIBusCfg_bits { … };
enum IntrStatus_bits { … };
#define DEFAULT_INTR …
enum TxConfig_bits { … };
#define TX_FLTH_VAL …
#define TX_DRTH_VAL_START …
#define TX_DRTH_VAL_INC …
#define TX_DRTH_VAL_LIMIT …
enum RxConfig_bits { … };
#define RX_DRTH_VAL …
enum ClkRun_bits { … };
enum WolCmd_bits { … };
enum RxFilterAddr_bits { … };
enum StatsCtrl_bits { … };
enum MIntrCtrl_bits { … };
enum PhyCtrl_bits { … };
#define PHY_ADDR_NONE …
#define PHY_ADDR_INTERNAL …
#define SRR_DP83815_C …
#define SRR_DP83815_D …
#define SRR_DP83816_A4 …
#define SRR_DP83816_A5 …
struct netdev_desc { … };
enum desc_status_bits { … };
struct netdev_private { … };
static void move_int_phy(struct net_device *dev, int addr);
static int eeprom_read(void __iomem *ioaddr, int location);
static int mdio_read(struct net_device *dev, int reg);
static void mdio_write(struct net_device *dev, int reg, u16 data);
static void init_phy_fixup(struct net_device *dev);
static int miiport_read(struct net_device *dev, int phy_id, int reg);
static void miiport_write(struct net_device *dev, int phy_id, int reg, u16 data);
static int find_mii(struct net_device *dev);
static void natsemi_reset(struct net_device *dev);
static void natsemi_reload_eeprom(struct net_device *dev);
static void natsemi_stop_rxtx(struct net_device *dev);
static int netdev_open(struct net_device *dev);
static void do_cable_magic(struct net_device *dev);
static void undo_cable_magic(struct net_device *dev);
static void check_link(struct net_device *dev);
static void netdev_timer(struct timer_list *t);
static void dump_ring(struct net_device *dev);
static void ns_tx_timeout(struct net_device *dev, unsigned int txqueue);
static int alloc_ring(struct net_device *dev);
static void refill_rx(struct net_device *dev);
static void init_ring(struct net_device *dev);
static void drain_tx(struct net_device *dev);
static void drain_ring(struct net_device *dev);
static void free_ring(struct net_device *dev);
static void reinit_ring(struct net_device *dev);
static void init_registers(struct net_device *dev);
static netdev_tx_t start_tx(struct sk_buff *skb, struct net_device *dev);
static irqreturn_t intr_handler(int irq, void *dev_instance);
static void netdev_error(struct net_device *dev, int intr_status);
static int natsemi_poll(struct napi_struct *napi, int budget);
static void netdev_rx(struct net_device *dev, int *work_done, int work_to_do);
static void netdev_tx_done(struct net_device *dev);
static int natsemi_change_mtu(struct net_device *dev, int new_mtu);
#ifdef CONFIG_NET_POLL_CONTROLLER
static void natsemi_poll_controller(struct net_device *dev);
#endif
static void __set_rx_mode(struct net_device *dev);
static void set_rx_mode(struct net_device *dev);
static void __get_stats(struct net_device *dev);
static struct net_device_stats *get_stats(struct net_device *dev);
static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
static int netdev_set_wol(struct net_device *dev, u32 newval);
static int netdev_get_wol(struct net_device *dev, u32 *supported, u32 *cur);
static int netdev_set_sopass(struct net_device *dev, u8 *newval);
static int netdev_get_sopass(struct net_device *dev, u8 *data);
static int netdev_get_ecmd(struct net_device *dev,
struct ethtool_link_ksettings *ecmd);
static int netdev_set_ecmd(struct net_device *dev,
const struct ethtool_link_ksettings *ecmd);
static void enable_wol_mode(struct net_device *dev, int enable_intr);
static int netdev_close(struct net_device *dev);
static int netdev_get_regs(struct net_device *dev, u8 *buf);
static int netdev_get_eeprom(struct net_device *dev, u8 *buf);
static const struct ethtool_ops ethtool_ops;
#define NATSEMI_ATTR(_name) …
#define NATSEMI_CREATE_FILE(_dev, _name) …
#define NATSEMI_REMOVE_FILE(_dev, _name) …
NATSEMI_ATTR(…);
static ssize_t natsemi_show_dspcfg_workaround(struct device *dev,
struct device_attribute *attr,
char *buf)
{ … }
static ssize_t natsemi_set_dspcfg_workaround(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static inline void __iomem *ns_ioaddr(struct net_device *dev)
{ … }
static inline void natsemi_irq_enable(struct net_device *dev)
{ … }
static inline void natsemi_irq_disable(struct net_device *dev)
{ … }
static void move_int_phy(struct net_device *dev, int addr)
{ … }
static void natsemi_init_media(struct net_device *dev)
{ … }
static const struct net_device_ops natsemi_netdev_ops = …;
static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
{ … }
#define eeprom_delay(ee_addr) …
#define EE_Write0 …
#define EE_Write1 …
enum EEPROM_Cmds { … };
static int eeprom_read(void __iomem *addr, int location)
{ … }
#define mii_delay(ioaddr) …
static int mii_getbit (struct net_device *dev)
{ … }
static void mii_send_bits (struct net_device *dev, u32 data, int len)
{ … }
static int miiport_read(struct net_device *dev, int phy_id, int reg)
{ … }
static void miiport_write(struct net_device *dev, int phy_id, int reg, u16 data)
{ … }
static int mdio_read(struct net_device *dev, int reg)
{ … }
static void mdio_write(struct net_device *dev, int reg, u16 data)
{ … }
static void init_phy_fixup(struct net_device *dev)
{ … }
static int switch_port_external(struct net_device *dev)
{ … }
static int switch_port_internal(struct net_device *dev)
{ … }
static int find_mii(struct net_device *dev)
{ … }
#define CFG_RESET_SAVE …
#define WCSR_RESET_SAVE …
#define RFCR_RESET_SAVE …
static void natsemi_reset(struct net_device *dev)
{ … }
static void reset_rx(struct net_device *dev)
{ … }
static void natsemi_reload_eeprom(struct net_device *dev)
{ … }
static void natsemi_stop_rxtx(struct net_device *dev)
{ … }
static int netdev_open(struct net_device *dev)
{ … }
static void do_cable_magic(struct net_device *dev)
{ … }
static void undo_cable_magic(struct net_device *dev)
{ … }
static void check_link(struct net_device *dev)
{ … }
static void init_registers(struct net_device *dev)
{ … }
static void netdev_timer(struct timer_list *t)
{ … }
static void dump_ring(struct net_device *dev)
{ … }
static void ns_tx_timeout(struct net_device *dev, unsigned int txqueue)
{ … }
static int alloc_ring(struct net_device *dev)
{ … }
static void refill_rx(struct net_device *dev)
{ … }
static void set_bufsize(struct net_device *dev)
{ … }
static void init_ring(struct net_device *dev)
{ … }
static void drain_tx(struct net_device *dev)
{ … }
static void drain_rx(struct net_device *dev)
{ … }
static void drain_ring(struct net_device *dev)
{ … }
static void free_ring(struct net_device *dev)
{ … }
static void reinit_rx(struct net_device *dev)
{ … }
static void reinit_ring(struct net_device *dev)
{ … }
static netdev_tx_t start_tx(struct sk_buff *skb, struct net_device *dev)
{ … }
static void netdev_tx_done(struct net_device *dev)
{ … }
static irqreturn_t intr_handler(int irq, void *dev_instance)
{ … }
static int natsemi_poll(struct napi_struct *napi, int budget)
{ … }
static void netdev_rx(struct net_device *dev, int *work_done, int work_to_do)
{ … }
static void netdev_error(struct net_device *dev, int intr_status)
{ … }
static void __get_stats(struct net_device *dev)
{ … }
static struct net_device_stats *get_stats(struct net_device *dev)
{ … }
#ifdef CONFIG_NET_POLL_CONTROLLER
static void natsemi_poll_controller(struct net_device *dev)
{ … }
#endif
#define HASH_TABLE …
static void __set_rx_mode(struct net_device *dev)
{ … }
static int natsemi_change_mtu(struct net_device *dev, int new_mtu)
{ … }
static void set_rx_mode(struct net_device *dev)
{ … }
static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
{ … }
static int get_regs_len(struct net_device *dev)
{ … }
static int get_eeprom_len(struct net_device *dev)
{ … }
static int get_link_ksettings(struct net_device *dev,
struct ethtool_link_ksettings *ecmd)
{ … }
static int set_link_ksettings(struct net_device *dev,
const struct ethtool_link_ksettings *ecmd)
{ … }
static void get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{ … }
static int set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{ … }
static void get_regs(struct net_device *dev, struct ethtool_regs *regs, void *buf)
{ … }
static u32 get_msglevel(struct net_device *dev)
{ … }
static void set_msglevel(struct net_device *dev, u32 val)
{ … }
static int nway_reset(struct net_device *dev)
{ … }
static u32 get_link(struct net_device *dev)
{ … }
static int get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
{ … }
static const struct ethtool_ops ethtool_ops = …;
static int netdev_set_wol(struct net_device *dev, u32 newval)
{ … }
static int netdev_get_wol(struct net_device *dev, u32 *supported, u32 *cur)
{ … }
static int netdev_set_sopass(struct net_device *dev, u8 *newval)
{ … }
static int netdev_get_sopass(struct net_device *dev, u8 *data)
{ … }
static int netdev_get_ecmd(struct net_device *dev,
struct ethtool_link_ksettings *ecmd)
{ … }
static int netdev_set_ecmd(struct net_device *dev,
const struct ethtool_link_ksettings *ecmd)
{ … }
static int netdev_get_regs(struct net_device *dev, u8 *buf)
{ … }
#define SWAP_BITS(x) …
static int netdev_get_eeprom(struct net_device *dev, u8 *buf)
{ … }
static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
{ … }
static void enable_wol_mode(struct net_device *dev, int enable_intr)
{ … }
static int netdev_close(struct net_device *dev)
{ … }
static void natsemi_remove1(struct pci_dev *pdev)
{ … }
static int __maybe_unused natsemi_suspend(struct device *dev_d)
{ … }
static int __maybe_unused natsemi_resume(struct device *dev_d)
{ … }
static SIMPLE_DEV_PM_OPS(natsemi_pm_ops, natsemi_suspend, natsemi_resume);
static struct pci_driver natsemi_driver = …;
static int __init natsemi_init_mod (void)
{ … }
static void __exit natsemi_exit_mod (void)
{ … }
module_init(…) …;
module_exit(natsemi_exit_mod);