PHY change 8bit -> 8/16/32 bit.

From: Rogier Wolff (R.E.Wolff@BitWizard.nl)
Date: Wed Aug 09 2000 - 07:22:11 EST


Hi,

I've made the suggested change:

The parameter on "read/write phy chip" is now 32 bits. Many drivers
write the "value" to a 32bit register on the chip. In these cases I've
assumed that the chip may actually implement 32bits of that register
to perform 32bit writes to the phy. Just one case had an evidently
8bit field where the "val" parameter was passed into. So that one
returns error for the non-8bit writes.

Tell me what you think. Feedback appreciated. I cannot test this, as I
have none of the hardware. :-(

Regards,

                        Roger.

----------------------------------------------------------------------

diff -ur linux-2.4.0-test6-pre1.clean/drivers/atm/eni.c linux-2.4.0-test6-pre1.phy_change/drivers/atm/eni.c
--- linux-2.4.0-test6-pre1.clean/drivers/atm/eni.c Wed Aug 2 10:26:41 2000
+++ linux-2.4.0-test6-pre1.phy_change/drivers/atm/eni.c Thu Aug 3 10:49:20 2000
@@ -2103,17 +2103,17 @@
 }
 
 
-static void eni_phy_put(struct atm_dev *dev,unsigned char value,
+static void eni_phy_put(struct atm_dev *dev,unsigned int value,
     unsigned long addr)
 {
- writel(value,ENI_DEV(dev)->phy+addr*4);
+ writel(value,ENI_DEV(dev)->phy+(addr & ATM_PHY_MASK)*4);
 }
 
 
 
-static unsigned char eni_phy_get(struct atm_dev *dev,unsigned long addr)
+static unsigned int eni_phy_get(struct atm_dev *dev,unsigned long addr)
 {
- return readl(ENI_DEV(dev)->phy+addr*4);
+ return readl(ENI_DEV(dev)->phy+(addr & ATM_PHY_MASK)*4);
 }
 
 
diff -ur linux-2.4.0-test6-pre1.clean/drivers/atm/horizon.c linux-2.4.0-test6-pre1.phy_change/drivers/atm/horizon.c
--- linux-2.4.0-test6-pre1.clean/drivers/atm/horizon.c Wed Aug 2 10:26:41 2000
+++ linux-2.4.0-test6-pre1.phy_change/drivers/atm/horizon.c Thu Aug 3 10:50:08 2000
@@ -2684,13 +2684,13 @@
   return -1;
 }
 
-unsigned char hrz_phy_get (struct atm_dev * atm_dev, unsigned long addr) {
+unsigned int hrz_phy_get (struct atm_dev * atm_dev, unsigned long addr) {
   hrz_dev * dev = HRZ_DEV(atm_dev);
   PRINTD (DBG_FLOW, "hrz_phy_get");
   return 0;
 }
 
-static void hrz_phy_put (struct atm_dev * atm_dev, unsigned char value,
+static void hrz_phy_put (struct atm_dev * atm_dev, unsigned int value,
                          unsigned long addr) {
   hrz_dev * dev = HRZ_DEV(atm_dev);
   PRINTD (DBG_FLOW, "hrz_phy_put");
diff -ur linux-2.4.0-test6-pre1.clean/drivers/atm/iphase.c linux-2.4.0-test6-pre1.phy_change/drivers/atm/iphase.c
--- linux-2.4.0-test6-pre1.clean/drivers/atm/iphase.c Wed Aug 2 10:30:44 2000
+++ linux-2.4.0-test6-pre1.phy_change/drivers/atm/iphase.c Wed Aug 9 14:10:25 2000
@@ -76,7 +76,7 @@
 };
 #define PRIV(dev) ((struct suni_priv *) dev->phy_data)
 
-static unsigned char ia_phy_get(struct atm_dev *dev, unsigned long addr);
+static unsigned int ia_phy_get(struct atm_dev *dev, unsigned long addr);
 
 static IADEV *ia_dev[8] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
 static struct atm_dev *_ia_dev[8] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
@@ -2429,15 +2429,15 @@
          return;
 }
 
-static void ia_phy_put(struct atm_dev *dev, unsigned char value,
+static void ia_phy_put(struct atm_dev *dev, unsigned int value,
         unsigned long addr)
 {
- writel(value, INPH_IA_DEV(dev)->phy+addr);
+ writel(value, INPH_IA_DEV(dev)->phy+ (addr & ATM_PHY_MASK));
 }
   
-static unsigned char ia_phy_get(struct atm_dev *dev, unsigned long addr)
+static unsigned int ia_phy_get(struct atm_dev *dev, unsigned long addr)
 {
- return readl(INPH_IA_DEV(dev)->phy+addr);
+ return readl(INPH_IA_DEV(dev)->phy+ (addr & ATM_PHY_MASK));
 }
 
 #if LINUX_VERSION_CODE >= 0x20312
diff -ur linux-2.4.0-test6-pre1.clean/drivers/atm/nicstar.c linux-2.4.0-test6-pre1.phy_change/drivers/atm/nicstar.c
--- linux-2.4.0-test6-pre1.clean/drivers/atm/nicstar.c Wed Aug 2 10:26:41 2000
+++ linux-2.4.0-test6-pre1.phy_change/drivers/atm/nicstar.c Wed Aug 9 14:09:50 2000
@@ -250,9 +250,9 @@
 static void ns_poll(unsigned long arg);
 static int ns_parse_mac(char *mac, unsigned char *esi);
 static short ns_h2i(char c);
-static void ns_phy_put(struct atm_dev *dev, unsigned char value,
+static void ns_phy_put(struct atm_dev *dev, unsigned int value,
                        unsigned long addr);
-static unsigned char ns_phy_get(struct atm_dev *dev, unsigned long addr);
+static unsigned int ns_phy_get(struct atm_dev *dev, unsigned long addr);
 
 
 
@@ -3142,7 +3142,7 @@
 
 
 
-static void ns_phy_put(struct atm_dev *dev, unsigned char value,
+static void ns_phy_put(struct atm_dev *dev, unsigned int value,
                     unsigned long addr)
 {
    ns_dev *card;
@@ -3159,11 +3159,11 @@
 
 
 
-static unsigned char ns_phy_get(struct atm_dev *dev, unsigned long addr)
+static unsigned int ns_phy_get(struct atm_dev *dev, unsigned long addr)
 {
    ns_dev *card;
    unsigned long flags;
- unsigned long data;
+ unsigned int data;
 
    card = dev->dev_data;
    ns_grab_res_lock(card, flags);
@@ -3173,5 +3173,5 @@
    while(CMD_BUSY(card));
    data = readl(card->membase + DR0) & 0x000000FF;
    spin_unlock_irqrestore(&card->res_lock, flags);
- return (unsigned char) data;
+ return data;
 }
diff -ur linux-2.4.0-test6-pre1.clean/drivers/atm/zatm.c linux-2.4.0-test6-pre1.phy_change/drivers/atm/zatm.c
--- linux-2.4.0-test6-pre1.clean/drivers/atm/zatm.c Wed Aug 2 10:30:44 2000
+++ linux-2.4.0-test6-pre1.phy_change/drivers/atm/zatm.c Thu Aug 3 11:12:29 2000
@@ -1753,7 +1753,7 @@
 }
 
 
-static void zatm_phy_put(struct atm_dev *dev,unsigned char value,
+static void zatm_phy_put(struct atm_dev *dev,unsigned int value,
     unsigned long addr)
 {
         struct zatm_dev *zatm_dev;
@@ -1762,18 +1762,20 @@
         zwait;
         zout(value,CER);
         zout(uPD98401_IND_ACC | uPD98401_IA_B0 |
- (uPD98401_IA_TGT_PHY << uPD98401_IA_TGT_SHIFT) | addr,CMR);
+ (uPD98401_IA_TGT_PHY << uPD98401_IA_TGT_SHIFT) |
+ (addr & ATM_PHY_MASK),CMR);
 }
 
 
-static unsigned char zatm_phy_get(struct atm_dev *dev,unsigned long addr)
+static unsigned int zatm_phy_get(struct atm_dev *dev,unsigned long addr)
 {
         struct zatm_dev *zatm_dev;
 
         zatm_dev = ZATM_DEV(dev);
         zwait;
         zout(uPD98401_IND_ACC | uPD98401_IA_B0 | uPD98401_IA_RW |
- (uPD98401_IA_TGT_PHY << uPD98401_IA_TGT_SHIFT) | addr,CMR);
+ (uPD98401_IA_TGT_PHY << uPD98401_IA_TGT_SHIFT) |
+ (addr & ATM_PHY_MASK),CMR);
         zwait;
         return zin(CER) & 0xff;
 }
diff -ur linux-2.4.0-test6-pre1.clean/include/linux/atmdev.h linux-2.4.0-test6-pre1.phy_change/include/linux/atmdev.h
--- linux-2.4.0-test6-pre1.clean/include/linux/atmdev.h Tue Aug 8 15:14:45 2000
+++ linux-2.4.0-test6-pre1.phy_change/include/linux/atmdev.h Wed Aug 9 14:15:28 2000
@@ -366,9 +366,9 @@
             void (*discard)(struct atm_vcc *vcc,void *user),void *user);
 #endif
         int (*send_oam)(struct atm_vcc *vcc,void *cell,int flags);
- void (*phy_put)(struct atm_dev *dev,unsigned char value,
+ void (*phy_put)(struct atm_dev *dev,unsigned int value,
             unsigned long addr);
- unsigned char (*phy_get)(struct atm_dev *dev,unsigned long addr);
+ unsigned int (*phy_get)(struct atm_dev *dev,unsigned long addr);
         void (*feedback)(struct atm_vcc *vcc,struct sk_buff *skb,
             unsigned long start,unsigned long dest,int len);
         int (*change_qos)(struct atm_vcc *vcc,struct atm_qos *qos,int flags);
@@ -384,6 +384,17 @@
         void (*interrupt)(struct atm_dev *dev);
         int (*stop)(struct atm_dev *dev);
 };
+
+
+/* This mask masks out the bits that specify the wordsize when
+ Highest 4 bits: 0 -> 8 bits, 1 -> 16 bits, 2 -> 32 bits
+ other values: reserved.. */
+#define ATM_PHY_MASK 0x0fffffff
+
+#define ATM_PHY_8BIT 0x00000000
+#define ATM_PHY_16BIT 0x10000000
+#define ATM_PHY_32BIT 0x20000000
+
 
 struct atm_skb_data {
         struct atm_vcc *vcc; /* ATM VCC */

-- 
** R.E.Wolff@BitWizard.nl ** http://www.BitWizard.nl/ ** +31-15-2137555 **
*-- BitWizard writes Linux device drivers for any device you may have! --*
*       Common sense is the collection of                                *
******  prejudices acquired by age eighteen.   -- Albert Einstein ********

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Tue Aug 15 2000 - 21:00:18 EST