Commit 2c8e5e76 authored by Neil Brown's avatar Neil Brown Committed by Linus Torvalds

[PATCH] Update umem driver for newer cards.

parent d3877325
...@@ -149,6 +149,7 @@ struct cardinfo { ...@@ -149,6 +149,7 @@ struct cardinfo {
spinlock_t lock; spinlock_t lock;
int check_batteries; int check_batteries;
int flags;
}; };
static struct cardinfo cards[MM_MAXCARDS]; static struct cardinfo cards[MM_MAXCARDS];
...@@ -589,9 +590,12 @@ HW_TRACE(0x30); ...@@ -589,9 +590,12 @@ HW_TRACE(0x30);
} }
/* clear COMPLETION interrupts */ /* clear COMPLETION interrupts */
writel(cpu_to_le32(DMASCR_DMA_COMPLETE|DMASCR_CHAIN_COMPLETE), if (card->flags & UM_FLAG_NO_BYTE_STATUS)
card->csr_remap+ DMA_STATUS_CTRL); writel(cpu_to_le32(DMASCR_DMA_COMPLETE|DMASCR_CHAIN_COMPLETE),
card->csr_remap+ DMA_STATUS_CTRL);
else
writeb((DMASCR_DMA_COMPLETE|DMASCR_CHAIN_COMPLETE) >> 16,
card->csr_remap+ DMA_STATUS_CTRL + 2);
/* log errors and clear interrupt status */ /* log errors and clear interrupt status */
if (dma_status & DMASCR_ANY_ERR) { if (dma_status & DMASCR_ANY_ERR) {
...@@ -756,15 +760,16 @@ static void check_all_batteries(unsigned long ptr) ...@@ -756,15 +760,16 @@ static void check_all_batteries(unsigned long ptr)
{ {
int i; int i;
for (i = 0; i < num_cards; i++) { for (i = 0; i < num_cards; i++)
struct cardinfo *card = &cards[i]; if (!(cards[i].flags & UM_FLAG_NO_BATT)) {
spin_lock_bh(&card->lock); struct cardinfo *card = &cards[i];
if (card->Active >= 0) spin_lock_bh(&card->lock);
card->check_batteries = 1; if (card->Active >= 0)
else card->check_batteries = 1;
check_batteries(card); else
spin_unlock_bh(&card->lock); check_batteries(card);
} spin_unlock_bh(&card->lock);
}
init_battery_timer(); init_battery_timer();
} }
...@@ -870,6 +875,7 @@ static int __devinit mm_pci_probe(struct pci_dev *dev, const struct pci_device_i ...@@ -870,6 +875,7 @@ static int __devinit mm_pci_probe(struct pci_dev *dev, const struct pci_device_i
unsigned char mem_present; unsigned char mem_present;
unsigned char batt_status; unsigned char batt_status;
unsigned int saved_bar, data; unsigned int saved_bar, data;
int magic_number;
if (pci_enable_device(dev) < 0) if (pci_enable_device(dev) < 0)
return -ENODEV; return -ENODEV;
...@@ -934,12 +940,33 @@ static int __devinit mm_pci_probe(struct pci_dev *dev, const struct pci_device_i ...@@ -934,12 +940,33 @@ static int __devinit mm_pci_probe(struct pci_dev *dev, const struct pci_device_i
printk(KERN_INFO "MM%d: MEM area not remapped (CONFIG_MM_MAP_MEMORY not set)\n", printk(KERN_INFO "MM%d: MEM area not remapped (CONFIG_MM_MAP_MEMORY not set)\n",
card->card_number); card->card_number);
#endif #endif
if (readb(card->csr_remap + MEMCTRLSTATUS_MAGIC) != MM_MAGIC_VALUE) { switch(card->dev->device) {
case 0x5415:
card->flags |= UM_FLAG_NO_BYTE_STATUS | UM_FLAG_NO_BATTREG;
magic_number = 0x59;
break;
case 0x5425:
card->flags |= UM_FLAG_NO_BYTE_STATUS;
magic_number = 0x5C;
break;
case 0x6155:
card->flags |= UM_FLAG_NO_BYTE_STATUS | UM_FLAG_NO_BATTREG | UM_FLAG_NO_BATT;
magic_number = 0x99;
break;
default:
magic_number = 0x100;
break;
}
if (readb(card->csr_remap + MEMCTRLSTATUS_MAGIC) != magic_number) {
printk(KERN_ERR "MM%d: Magic number invalid\n", card->card_number); printk(KERN_ERR "MM%d: Magic number invalid\n", card->card_number);
ret = -ENOMEM; ret = -ENOMEM;
goto failed_magic; goto failed_magic;
} }
card->mm_pages[0].desc = pci_alloc_consistent(card->dev, card->mm_pages[0].desc = pci_alloc_consistent(card->dev,
PAGE_SIZE*2, PAGE_SIZE*2,
&card->mm_pages[0].page_dma); &card->mm_pages[0].page_dma);
...@@ -998,14 +1025,19 @@ static int __devinit mm_pci_probe(struct pci_dev *dev, const struct pci_device_i ...@@ -998,14 +1025,19 @@ static int __devinit mm_pci_probe(struct pci_dev *dev, const struct pci_device_i
card->battery[1].good = !(batt_status & BATTERY_2_FAILURE); card->battery[1].good = !(batt_status & BATTERY_2_FAILURE);
card->battery[0].last_change = card->battery[1].last_change = jiffies; card->battery[0].last_change = card->battery[1].last_change = jiffies;
printk(KERN_INFO "MM%d: Size %d KB, Battery 1 %s (%s), Battery 2 %s (%s)\n", if (card->flags & UM_FLAG_NO_BATT)
card->card_number, card->mm_size, printk(KERN_INFO "MM%d: Size %d KB\n",
(batt_status & BATTERY_1_DISABLED ? "Disabled" : "Enabled"), card->card_number, card->mm_size);
card->battery[0].good ? "OK" : "FAILURE", else {
(batt_status & BATTERY_2_DISABLED ? "Disabled" : "Enabled"), printk(KERN_INFO "MM%d: Size %d KB, Battery 1 %s (%s), Battery 2 %s (%s)\n",
card->battery[1].good ? "OK" : "FAILURE"); card->card_number, card->mm_size,
(batt_status & BATTERY_1_DISABLED ? "Disabled" : "Enabled"),
card->battery[0].good ? "OK" : "FAILURE",
(batt_status & BATTERY_2_DISABLED ? "Disabled" : "Enabled"),
card->battery[1].good ? "OK" : "FAILURE");
set_fault_to_battery_status(card); set_fault_to_battery_status(card);
}
pci_read_config_dword(dev, PCI_BASE_ADDRESS_1, &saved_bar); pci_read_config_dword(dev, PCI_BASE_ADDRESS_1, &saved_bar);
data = 0xffffffff; data = 0xffffffff;
...@@ -1118,6 +1150,16 @@ static const struct pci_device_id __devinitdata mm_pci_ids[] = { { ...@@ -1118,6 +1150,16 @@ static const struct pci_device_id __devinitdata mm_pci_ids[] = { {
}, { }, {
.vendor = PCI_VENDOR_ID_MICRO_MEMORY, .vendor = PCI_VENDOR_ID_MICRO_MEMORY,
.device = PCI_DEVICE_ID_MICRO_MEMORY_5425CN, .device = PCI_DEVICE_ID_MICRO_MEMORY_5425CN,
}, {
.vendor = PCI_VENDOR_ID_MICRO_MEMORY,
.device = PCI_DEVICE_ID_MICRO_MEMORY_6155,
}, {
.vendor = 0x8086,
.device = 0xB555,
.subvendor= 0x1332,
.subdevice= 0x5460,
.class = 0x050000,
.class_mask= 0,
}, { /* end: all zeroes */ } }, { /* end: all zeroes */ }
}; };
......
...@@ -128,4 +128,11 @@ struct mm_dma_desc { ...@@ -128,4 +128,11 @@ struct mm_dma_desc {
#define PCI_VENDOR_ID_MICRO_MEMORY 0x1332 #define PCI_VENDOR_ID_MICRO_MEMORY 0x1332
#define PCI_DEVICE_ID_MICRO_MEMORY_5415CN 0x5415 #define PCI_DEVICE_ID_MICRO_MEMORY_5415CN 0x5415
#define PCI_DEVICE_ID_MICRO_MEMORY_5425CN 0x5425 #define PCI_DEVICE_ID_MICRO_MEMORY_5425CN 0x5425
#define PCI_DEVICE_ID_MICRO_MEMORY_6155 0x6155
/* bits for card->flags */
#define UM_FLAG_DMA_IN_REGS 1
#define UM_FLAG_NO_BYTE_STATUS 2
#define UM_FLAG_NO_BATTREG 4
#define UM_FLAG_NO_BATT 8
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment