From: 刘益星 <lyx@rock-chips.com>
Date: Sat, 29 May 2010 03:39:53 +0000 (+0000)
Subject: add mutex_lock between nandc and dm9000,use mutex_lock replace some mutex_trylock... 
X-Git-Tag: firefly_0821_release~11443
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a019fb65abadca2b3f2991f19050773dce9f5590;p=firefly-linux-kernel-4.4.55.git

add mutex_lock between nandc and dm9000,use mutex_lock replace some mutex_trylock in dm9000 driver
---

diff --git a/.config b/.config
index 231d8c092761..28bb46d1d9f5 100644
--- a/.config
+++ b/.config
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.32.9
-# Wed May 19 19:32:08 2010
+# Fri May 28 08:07:09 2010
 #
 CONFIG_ARM=y
 CONFIG_SYS_SUPPORTS_APM_EMULATION=y
@@ -591,7 +591,7 @@ CONFIG_MII=y
 # CONFIG_SMC91X is not set
 CONFIG_DM9000=y
 CONFIG_DM9000_DEBUGLEVEL=4
-# CONFIG_DM9000_USE_NAND_CONTROL is not set
+CONFIG_DM9000_USE_NAND_CONTROL=y
 # CONFIG_DM9000_USE_NOR_CONTROL is not set
 # CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL is not set
 # CONFIG_ENC28J60 is not set
diff --git a/drivers/mtd/nand/rk2818_nand.c b/drivers/mtd/nand/rk2818_nand.c
index 19e65f0a77bd..31a9cb8f2a03 100644
--- a/drivers/mtd/nand/rk2818_nand.c
+++ b/drivers/mtd/nand/rk2818_nand.c
@@ -1007,6 +1007,14 @@ static void __exit rk2818_nand_exit(void)
 
 
 // nandc dma cs mutex for dm9000 interface
+void rk2818_nand_status_mutex_lock(void)
+{
+     pNANDC pRK28NC=  (pNANDC)RK2818_NANDC_BASE;
+     mutex_lock(&rknand_mutex);
+     pRK28NC->FMCTL &=0xffffff00;   // release chip select
+
+}
+
 int rk2818_nand_status_mutex_trylock(void)
 {
      pNANDC pRK28NC=  (pNANDC)RK2818_NANDC_BASE;
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
index 1b0bb74a2e66..701599ac4c42 100644
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -148,9 +148,11 @@ typedef struct board_info {
 } while (0)
 
 #ifdef CONFIG_DM9000_USE_NAND_CONTROL
+extern void rk2818_nand_status_mutex_lock(void);
 extern	int rk2818_nand_status_mutex_trylock(void);
 extern	void rk2818_nand_status_mutex_unlock(void);
 #else
+static void rk2818_nand_status_mutex_lock(void){return;}
 static int rk2818_nand_status_mutex_trylock(void) {return 1;}
 static void rk2818_nand_status_mutex_unlock(void) {return;}
 #endif
@@ -322,8 +324,7 @@ dm9000_read_locked(board_info_t *db, int reg)
 	unsigned long flags;
 	unsigned int ret;
 	
-	while(!rk2818_nand_status_mutex_trylock())
-		dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+	rk2818_nand_status_mutex_lock();
 
 	spin_lock_irqsave(&db->lock, flags);	
 	ret = ior(db, reg);
@@ -383,8 +384,7 @@ dm9000_read_eeprom(board_info_t *db, int offset, u8 *to)
 
 	mutex_lock(&db->addr_lock);
 	
-	while(!rk2818_nand_status_mutex_trylock())
-		dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+	rk2818_nand_status_mutex_lock();
 
 	spin_lock_irqsave(&db->lock, flags);
 		
@@ -400,8 +400,7 @@ dm9000_read_eeprom(board_info_t *db, int offset, u8 *to)
 	/* delay for at-least 150uS */
 	msleep(1);
 	
-	while(!rk2818_nand_status_mutex_trylock())
-		dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+	rk2818_nand_status_mutex_lock();
 
 	spin_lock_irqsave(&db->lock, flags);
 	
@@ -430,8 +429,7 @@ dm9000_write_eeprom(board_info_t *db, int offset, u8 *data)
 
 	mutex_lock(&db->addr_lock);
 	
-	while(!rk2818_nand_status_mutex_trylock())
-		dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+	rk2818_nand_status_mutex_lock();
 
 	spin_lock_irqsave(&db->lock, flags);	
 	iow(db, DM9000_EPAR, offset);
@@ -446,8 +444,7 @@ dm9000_write_eeprom(board_info_t *db, int offset, u8 *data)
 
 	mdelay(1);	/* wait at least 150uS to clear */
 	
-	while(!rk2818_nand_status_mutex_trylock())
-		dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+	rk2818_nand_status_mutex_lock();
 
 	spin_lock_irqsave(&db->lock, flags);
 	iow(db, DM9000_EPCR, 0);
@@ -519,8 +516,7 @@ static int dm9000_set_rx_csum(struct net_device *dev, uint32_t data)
 	if (dm->can_csum) {
 		dm->rx_csum = data;
 
-		while(!rk2818_nand_status_mutex_trylock())
-			dev_dbg(dm->dev, "fun:%s, nand busy\n", __func__);
+		rk2818_nand_status_mutex_lock();
 		
 		spin_lock_irqsave(&dm->lock, flags);
 		iow(dm, DM9000_RCSR, dm->rx_csum ? RCSR_CSUM : 0);
@@ -724,8 +720,7 @@ dm9000_hash_table(struct net_device *dev)
 
 	dm9000_dbg(db, 1, "entering %s\n", __func__);
 	
-	while(!rk2818_nand_status_mutex_trylock())
-		dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+	rk2818_nand_status_mutex_lock();
 
 	spin_lock_irqsave(&db->lock, flags);
 	
@@ -825,8 +820,7 @@ static void dm9000_timeout(struct net_device *dev)
 	/* Save previous register address */
 	reg_save = readb(db->io_addr);
 	
-	while(!rk2818_nand_status_mutex_trylock())
-		dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+	rk2818_nand_status_mutex_lock();
 	
 	spin_lock_irqsave(&db->lock, flags);
 
@@ -1073,8 +1067,7 @@ static void dm9000_interrupt_work(struct work_struct *work)
 
 	/* holders of db->lock must always block IRQs */
 	
-	while(!rk2818_nand_status_mutex_trylock())
-		dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+	rk2818_nand_status_mutex_lock();
 	
 	spin_lock_irqsave(&db->lock, flags);
 
@@ -1270,8 +1263,7 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg)
 
 	mutex_lock(&db->addr_lock);
 
-	while(!rk2818_nand_status_mutex_trylock())
-		dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+	rk2818_nand_status_mutex_lock();
 
 	spin_lock_irqsave(&db->lock,flags);
 	
@@ -1290,8 +1282,7 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg)
 
 	dm9000_msleep(db, 1);		/* Wait read complete */
 
-	while(!rk2818_nand_status_mutex_trylock())
-		dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+	rk2818_nand_status_mutex_lock();
 
 	spin_lock_irqsave(&db->lock,flags);
 	
@@ -1328,8 +1319,7 @@ dm9000_phy_write(struct net_device *dev,
 	dm9000_dbg(db, 5, "phy_write[%02x] = %04x\n", reg, value);
 	mutex_lock(&db->addr_lock);
 
-	while(!rk2818_nand_status_mutex_trylock())
-		dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+	rk2818_nand_status_mutex_lock();
 
 	spin_lock_irqsave(&db->lock,flags);
 	
@@ -1352,8 +1342,7 @@ dm9000_phy_write(struct net_device *dev,
 
 	dm9000_msleep(db, 1);		/* Wait write complete */
 
-	while(!rk2818_nand_status_mutex_trylock())
-		dev_dbg(db->dev, "fun:%s, nand busy\n", __func__);
+	rk2818_nand_status_mutex_lock();
 
 	spin_lock_irqsave(&db->lock,flags);