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

This commit is contained in:
刘益星
2010-05-29 03:39:53 +00:00
committed by 黄涛
parent 11dd6922f7
commit a019fb65ab
3 changed files with 25 additions and 28 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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);