안녕하세요..
CS8900으로 NFS를 구현중인데...
CS8900 register setting으로 구현된 CS8900 reset control시 칩이 정상 동작하지 않는
문제가 발생해서 문의드립니다.
cs89x0.c에 있는 reset_chip(..) function에서
void __init reset_chip(struct net_device *dev)
{
#ifndef CONFIG_ARCH_IXDP2X01
struct net_local *lp = netdev_priv(dev);
int ioaddr = dev->base_addr;
#endif
int reset_start_time;
요부분...==>
/*************************************************************************************/
writereg(dev, PP_SelfCTL, readreg(dev, PP_SelfCTL) | POWER_ON_RESET);
/*************************************************************************************/
/* wait 30 ms */
current->state = TASK_INTERRUPTIBLE;
schedule_timeout(30*HZ/1000);
#ifndef CONFIG_ARCH_IXDP2X01
if (lp->chip_type != CS8900) {
/* Hardware problem requires PNP registers to be reconfigured after a reset */
outw(PP_CS8920_ISAINT, ioaddr + ADD_PORT);
outb(dev->irq, ioaddr + DATA_PORT);
outb(0, ioaddr + DATA_PORT + 1);
outw(PP_CS8920_ISAMemB, ioaddr + ADD_PORT);
outb((dev->mem_start >> 16) & 0xff, ioaddr + DATA_PORT);
outb((dev->mem_start >> 8) & 0xff, ioaddr + DATA_PORT + 1);
}
#endif /* IXDP2x01 */
/* Wait until the chip is reset */
reset_start_time = jiffies;
while( (readreg(dev, PP_SelfST) & INIT_DONE) == 0 && jiffies - reset_start_time < 2)
;
}
위의 code에서 reset bit를 control하여 cs8900을 reset시키면..
cs8900이 정상동작하지 않습니다. 여기서 정상동작하지 않는다는 의미는
일단 register reading이 전혀 엉뚱한 값으로 reading됩니다.
PP_SelfCTL 의 경우 0x15가 default값인데.. 0x100으로 바뀌어버립니다.
이상황에서 위의 reset control line을 제거하면 문제없이 CS8900이 동작하여
NFS까지 잘 붙습니다..
SW issue는 아닌듯한데...
왜 이런일이 생기는지 혹시 짐작 가시는 분 계시나여?.. T.T
칩 특성이기 때문에 뭐라고 얘기하기는 힘들지만요....^^