[PATCH 4/24] RT2x00: Add ethtool support

2006-07-26 Thread Ivo van Doorn
From Ivo van Doorn [EMAIL PROTECTED]

Add ethtool support.
At the moment we support the following features:
* read driver info
* read registers
* read eeprom
* enable and disable debug output

Signed-off-by: Ivo van Doorn [EMAIL PROTECTED]

---

diff -rU3 
wireless-dev-pciusb_dev/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 
wireless-dev-ethtool/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
--- wireless-dev-pciusb_dev/drivers/net/wireless/d80211/rt2x00/rt2400pci.c  
2006-07-23 15:53:06.0 +0200
+++ wireless-dev-ethtool/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 
2006-07-23 16:30:58.0 +0200
@@ -33,7 +33,9 @@
 #include linux/delay.h
 #include linux/skbuff.h
 #include linux/netdevice.h
+#include linux/etherdevice.h
 #include linux/wireless.h
+#include linux/ethtool.h
 
 #include net/iw_handler.h
 #include net/d80211.h
@@ -362,6 +364,79 @@
 #endif /* CONFIG_RT2400PCI_BUTTON */
 
 /*
+ * Ethtool handlers.
+ */
+static void rt2400pci_get_drvinfo(struct net_device *net_dev,
+   struct ethtool_drvinfo *drvinfo)
+{
+   struct rt2x00_dev *rt2x00dev = ieee80211_dev_hw_data(net_dev);
+
+   strcpy(drvinfo-driver, DRV_NAME);
+   strcpy(drvinfo-version, DRV_VERSION);
+   strcpy(drvinfo-bus_info, pci_name(rt2x00dev_pci(rt2x00dev)));
+   drvinfo-eedump_len = EEPROM_SIZE;
+   drvinfo-regdump_len = CSR_REG_SIZE;
+}
+
+static int rt2400pci_get_regs_len(struct net_device *net_dev)
+{
+   return CSR_REG_SIZE;
+}
+
+static void rt2400pci_get_regs(struct net_device *net_dev,
+   struct ethtool_regs *regs, void *data)
+{
+   struct rt2x00_dev *rt2x00dev = ieee80211_dev_hw_data(net_dev);
+
+   rt2x00_register_multiread(rt2x00dev, CSR_REG_BASE, data, CSR_REG_SIZE);
+   regs-version = *((u32*)data);
+   regs-len = CSR_REG_SIZE;
+}
+
+#ifdef CONFIG_RT2400PCI_DEBUG
+static u32 rt2400pci_get_msglevel(struct net_device *net_dev)
+{
+   return rt2x00_debug_level;
+}
+
+static void rt2400pci_set_msglevel(struct net_device *net_dev, u32 msg)
+{
+   rt2x00_debug_level = !!msg;
+}
+#endif /* CONFIG_RT2400PCI_DEBUG */
+
+static int rt2400pci_get_eeprom_len(struct net_device *net_dev)
+{
+   return EEPROM_SIZE;
+}
+
+static int rt2400pci_get_eeprom(struct net_device *net_dev,
+   struct ethtool_eeprom *eeprom, u8 *data)
+{
+   struct rt2x00_dev *rt2x00dev = ieee80211_dev_hw_data(net_dev);
+
+   eeprom-magic = 0xbad;
+
+   rt2x00_eeprom_multiread(rt2x00dev,
+   eeprom-offset / sizeof(u16), (void*)data, eeprom-len);
+
+   return 0;
+}
+
+static struct ethtool_ops rt2400pci_ethtool_ops = {
+   .get_drvinfo= rt2400pci_get_drvinfo,
+   .get_regs_len   = rt2400pci_get_regs_len,
+   .get_regs   = rt2400pci_get_regs,
+#ifdef CONFIG_RT2400PCI_DEBUG
+   .get_msglevel   = rt2400pci_get_msglevel,
+   .set_msglevel   = rt2400pci_set_msglevel,
+#endif /* CONFIG_RT2400PCI_DEBUG */
+   .get_link   = ethtool_op_get_link,
+   .get_eeprom_len = rt2400pci_get_eeprom_len,
+   .get_eeprom = rt2400pci_get_eeprom,
+};
+
+/*
  * Configuration handlers.
  */
 static void rt2400pci_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
@@ -2582,6 +2657,8 @@
goto exit_release_regions;
}
 
+   SET_ETHTOOL_OPS(net_dev, rt2400pci_ethtool_ops);
+
pci_set_drvdata(pci_dev, net_dev);
 
status = rt2400pci_initialize(pci_dev, net_dev);
diff -rU3 
wireless-dev-pciusb_dev/drivers/net/wireless/d80211/rt2x00/rt2400pci.h 
wireless-dev-ethtool/drivers/net/wireless/d80211/rt2x00/rt2400pci.h
--- wireless-dev-pciusb_dev/drivers/net/wireless/d80211/rt2x00/rt2400pci.h  
2006-07-22 23:05:16.0 +0200
+++ wireless-dev-ethtool/drivers/net/wireless/d80211/rt2x00/rt2400pci.h 
2006-07-23 16:34:46.0 +0200
@@ -39,6 +39,14 @@
 #define RF2421 0x0001
 
 /*
+ * Register layout information.
+ */
+#define CSR_REG_BASE   0x
+#define CSR_REG_SIZE   0x014c
+#define EEPROM_BASE0x
+#define EEPROM_SIZE0x00ff
+
+/*
  * Control/Status Registers(CSR).
  * Some values are set in TU, whereas 1 TU == 1024 us.
  */
diff -rU3 
wireless-dev-pciusb_dev/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 
wireless-dev-ethtool/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
--- wireless-dev-pciusb_dev/drivers/net/wireless/d80211/rt2x00/rt2500pci.c  
2006-07-23 15:53:09.0 +0200
+++ wireless-dev-ethtool/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 
2006-07-23 16:31:10.0 +0200
@@ -33,7 +33,9 @@
 #include linux/delay.h
 #include linux/skbuff.h
 #include linux/netdevice.h
+#include linux/etherdevice.h
 #include linux/wireless.h
+#include linux/ethtool.h
 
 #include net/iw_handler.h
 #include net/d80211.h
@@ -362,6 +364,79 @@
 #endif /* CONFIG_RT2500PCI_BUTTON */
 
 /*
+ * Ethtool handlers.
+ */
+static void rt2500pci_get_drvinfo(struct net_device *net_dev,
+   struct 

Re: [PATCH 4/24] RT2x00: Add ethtool support

2006-07-26 Thread Ivo van Doorn
From Ivo van Doorn [EMAIL PROTECTED]

Add ethtool support.
At the moment we support the following features:
* read driver info
* read registers
* read eeprom
* enable and disable debug output

Signed-off-by: Ivo van Doorn [EMAIL PROTECTED]

diff -rU3 
wireless-dev-pciusb_dev/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 
wireless-dev-ethtool/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
--- wireless-dev-pciusb_dev/drivers/net/wireless/d80211/rt2x00/rt2400pci.c  
2006-07-23 15:53:06.0 +0200
+++ wireless-dev-ethtool/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 
2006-07-23 16:30:58.0 +0200
@@ -33,7 +33,9 @@
 #include linux/delay.h
 #include linux/skbuff.h
 #include linux/netdevice.h
+#include linux/etherdevice.h
 #include linux/wireless.h
+#include linux/ethtool.h
 
 #include net/iw_handler.h
 #include net/d80211.h
@@ -362,6 +364,79 @@
 #endif /* CONFIG_RT2400PCI_BUTTON */
 
 /*
+ * Ethtool handlers.
+ */
+static void rt2400pci_get_drvinfo(struct net_device *net_dev,
+   struct ethtool_drvinfo *drvinfo)
+{
+   struct rt2x00_dev *rt2x00dev = ieee80211_dev_hw_data(net_dev);
+
+   strcpy(drvinfo-driver, DRV_NAME);
+   strcpy(drvinfo-version, DRV_VERSION);
+   strcpy(drvinfo-bus_info, pci_name(rt2x00dev_pci(rt2x00dev)));
+   drvinfo-eedump_len = EEPROM_SIZE;
+   drvinfo-regdump_len = CSR_REG_SIZE;
+}
+
+static int rt2400pci_get_regs_len(struct net_device *net_dev)
+{
+   return CSR_REG_SIZE;
+}
+
+static void rt2400pci_get_regs(struct net_device *net_dev,
+   struct ethtool_regs *regs, void *data)
+{
+   struct rt2x00_dev *rt2x00dev = ieee80211_dev_hw_data(net_dev);
+
+   rt2x00_register_multiread(rt2x00dev, CSR_REG_BASE, data, CSR_REG_SIZE);
+   regs-version = *((u32*)data);
+   regs-len = CSR_REG_SIZE;
+}
+
+#ifdef CONFIG_RT2400PCI_DEBUG
+static u32 rt2400pci_get_msglevel(struct net_device *net_dev)
+{
+   return rt2x00_debug_level;
+}
+
+static void rt2400pci_set_msglevel(struct net_device *net_dev, u32 msg)
+{
+   rt2x00_debug_level = !!msg;
+}
+#endif /* CONFIG_RT2400PCI_DEBUG */
+
+static int rt2400pci_get_eeprom_len(struct net_device *net_dev)
+{
+   return EEPROM_SIZE;
+}
+
+static int rt2400pci_get_eeprom(struct net_device *net_dev,
+   struct ethtool_eeprom *eeprom, u8 *data)
+{
+   struct rt2x00_dev *rt2x00dev = ieee80211_dev_hw_data(net_dev);
+
+   eeprom-magic = 0xbad;
+
+   rt2x00_eeprom_multiread(rt2x00dev,
+   eeprom-offset / sizeof(u16), (void*)data, eeprom-len);
+
+   return 0;
+}
+
+static struct ethtool_ops rt2400pci_ethtool_ops = {
+   .get_drvinfo= rt2400pci_get_drvinfo,
+   .get_regs_len   = rt2400pci_get_regs_len,
+   .get_regs   = rt2400pci_get_regs,
+#ifdef CONFIG_RT2400PCI_DEBUG
+   .get_msglevel   = rt2400pci_get_msglevel,
+   .set_msglevel   = rt2400pci_set_msglevel,
+#endif /* CONFIG_RT2400PCI_DEBUG */
+   .get_link   = ethtool_op_get_link,
+   .get_eeprom_len = rt2400pci_get_eeprom_len,
+   .get_eeprom = rt2400pci_get_eeprom,
+};
+
+/*
  * Configuration handlers.
  */
 static void rt2400pci_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
@@ -2582,6 +2657,8 @@
goto exit_release_regions;
}
 
+   SET_ETHTOOL_OPS(net_dev, rt2400pci_ethtool_ops);
+
pci_set_drvdata(pci_dev, net_dev);
 
status = rt2400pci_initialize(pci_dev, net_dev);
diff -rU3 
wireless-dev-pciusb_dev/drivers/net/wireless/d80211/rt2x00/rt2400pci.h 
wireless-dev-ethtool/drivers/net/wireless/d80211/rt2x00/rt2400pci.h
--- wireless-dev-pciusb_dev/drivers/net/wireless/d80211/rt2x00/rt2400pci.h  
2006-07-22 23:05:16.0 +0200
+++ wireless-dev-ethtool/drivers/net/wireless/d80211/rt2x00/rt2400pci.h 
2006-07-23 16:34:46.0 +0200
@@ -39,6 +39,14 @@
 #define RF2421 0x0001
 
 /*
+ * Register layout information.
+ */
+#define CSR_REG_BASE   0x
+#define CSR_REG_SIZE   0x014c
+#define EEPROM_BASE0x
+#define EEPROM_SIZE0x00ff
+
+/*
  * Control/Status Registers(CSR).
  * Some values are set in TU, whereas 1 TU == 1024 us.
  */
diff -rU3 
wireless-dev-pciusb_dev/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 
wireless-dev-ethtool/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
--- wireless-dev-pciusb_dev/drivers/net/wireless/d80211/rt2x00/rt2500pci.c  
2006-07-23 15:53:09.0 +0200
+++ wireless-dev-ethtool/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 
2006-07-23 16:31:10.0 +0200
@@ -33,7 +33,9 @@
 #include linux/delay.h
 #include linux/skbuff.h
 #include linux/netdevice.h
+#include linux/etherdevice.h
 #include linux/wireless.h
+#include linux/ethtool.h
 
 #include net/iw_handler.h
 #include net/d80211.h
@@ -362,6 +364,79 @@
 #endif /* CONFIG_RT2500PCI_BUTTON */
 
 /*
+ * Ethtool handlers.
+ */
+static void rt2500pci_get_drvinfo(struct net_device *net_dev,
+   struct ethtool_drvinfo