#define VERSION_STRING "Cirrus Logic CS8900A driver for Linux (Modified for ZL2440)"
#include <linux/kernel.h> #include <linux/module.h> #include <linux/types.h> #include <linux/version.h> #include <linux/errno.h> #include <linux/init.h> #include <linux/delay.h> #include <linux/ioport.h> #include <linux/pm.h> #include <linux/irq.h> //#include <asm/hardware.h>
#include <asm/io.h> #include <asm/uaccess.h> #include <linux/netdevice.h> #include <linux/etherdevice.h> #include <linux/skbuff.h>
// Added BSt
#include <asm/mach-types.h>
//#ifdef CONFIG_ARCH_SMDK2410
#if 1 //#include "asm/arch-s3c2410/regs-irq.h"
#include "mach/regs-mem.h" //#include "asm/arch/smdk2410.h"
#include "net/smdk2410.h"
#endif
#include "cs8900.h"
//#define FULL_DUPLEX
//#define DEBUG
typedef struct { struct net_device_stats stats; u16 txlen; int char_devnum;
spinlock_t lock; } cs8900_t;
int cs8900_probe (struct net_device *dev); static struct net_device *cs8900_dev ;
#define MAX_EEPROM_SIZE 256
static inline u16 cs8900_read (struct net_device *dev,u16 reg) { outw (reg,dev->base_addr + PP_Address); return (inw (dev->base_addr + PP_Data)); }
static inline void cs8900_write (struct net_device *dev,u16 reg,u16 value) { outw (reg,dev->base_addr + PP_Address); outw (value,dev->base_addr + PP_Data); }
static inline void cs8900_set (struct net_device *dev,u16 reg,u16 value) { cs8900_write (dev,reg,cs8900_read (dev,reg) | value); }
static inline void cs8900_clear (struct net_device *dev,u16 reg,u16 value) { cs8900_write (dev,reg,cs8900_read (dev,reg) & ~value); }
static inline void cs8900_frame_read (struct net_device *dev,struct sk_buff *skb,u16 length) { insw (dev->base_addr,skb_put (skb,length),(length + 1) / 2); }
static inline void cs8900_frame_write (struct net_device *dev,struct sk_buff *skb) { outsw (dev->base_addr,skb->data,(skb->len + 1) / 2); }
#ifdef DEBUG static inline int printable (int c) { return ((c >= 32 && c <= 126) || (c >= 174 && c <= 223) || (c >= 242 && c <= 243) || (c >= 252 && c <= 253)); }
static void dump16 (struct net_device *dev,const u8 *s,size_t len) { int i; char str[128];
if (!len) return;
*str = '\0';
for (i = 0; i < len; i++) { if (i && !(i % 4)) strcat (str," "); sprintf (str,"%s%.2x ",str,s[i]); }
for ( ; i < 16; i++) { if (i && !(i % 4)) strcat (str," "); strcat (str," "); }
strcat (str," "); for (i = 0; i < len; i++) sprintf (str,"%s%c",str,printable (s[i]) ? s[i] : '.');
printk (KERN_DEBUG "%s: %s\n",dev->name,str); }
static void hexdump (struct net_device *dev,const void *ptr,size_t size) { const u8 *s = (u8 *) ptr;
|