Merge git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-fixes-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-fixes-2.6: [PATCH] pcmcia/pcmcia_resource.c: fix crash when using Cardbus cards [PATCH] vrc4171: update config [PATCH] pcmcia: fix oops in static mapping case [PATCH] pcmcia: remove unneeded forward declarations [PATCH] pcmcia: do not set dev_node to NULL too early [PATCH] pcmcia: fix comment for pcmcia_load_firmware [PATCH] pcmcia: unload second device first [PATCH] pcmcia: add new ID to pcnet_cs
This commit is contained in:
Коммит
cb6aef2879
|
@ -1639,6 +1639,7 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
||||||
PCMCIA_DEVICE_PROD_ID12("CONTEC", "C-NET(PC)C-10L", 0x21cab552, 0xf6f90722),
|
PCMCIA_DEVICE_PROD_ID12("CONTEC", "C-NET(PC)C-10L", 0x21cab552, 0xf6f90722),
|
||||||
PCMCIA_DEVICE_PROD_ID12("corega", "FEther PCC-TXF", 0x0a21501a, 0xa51564a2),
|
PCMCIA_DEVICE_PROD_ID12("corega", "FEther PCC-TXF", 0x0a21501a, 0xa51564a2),
|
||||||
PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-T", 0x5261440f, 0xfa9d85bd),
|
PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-T", 0x5261440f, 0xfa9d85bd),
|
||||||
|
PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-TD", 0x5261440f, 0xc49bd73d),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Corega K.K.", "corega EtherII PCC-TD", 0xd4fdcbd8, 0xc49bd73d),
|
PCMCIA_DEVICE_PROD_ID12("Corega K.K.", "corega EtherII PCC-TD", 0xd4fdcbd8, 0xc49bd73d),
|
||||||
PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-T", 0x5261440f, 0x6705fcaa),
|
PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-T", 0x5261440f, 0x6705fcaa),
|
||||||
PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FastEther PCC-TX", 0x5261440f, 0x485e85d9),
|
PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FastEther PCC-TX", 0x5261440f, 0x485e85d9),
|
||||||
|
|
|
@ -250,7 +250,7 @@ config M32R_CFC_NUM
|
||||||
|
|
||||||
config PCMCIA_VRC4171
|
config PCMCIA_VRC4171
|
||||||
tristate "NEC VRC4171 Card Controllers support"
|
tristate "NEC VRC4171 Card Controllers support"
|
||||||
depends on VRC4171 && PCMCIA
|
depends on CPU_VR41XX && ISA && PCMCIA
|
||||||
|
|
||||||
config PCMCIA_VRC4173
|
config PCMCIA_VRC4173
|
||||||
tristate "NEC VRC4173 CARDU support"
|
tristate "NEC VRC4173 CARDU support"
|
||||||
|
|
|
@ -236,11 +236,11 @@ static void pcmcia_check_driver(struct pcmcia_driver *p_drv)
|
||||||
/**
|
/**
|
||||||
* pcmcia_load_firmware - load CIS from userspace if device-provided is broken
|
* pcmcia_load_firmware - load CIS from userspace if device-provided is broken
|
||||||
* @dev - the pcmcia device which needs a CIS override
|
* @dev - the pcmcia device which needs a CIS override
|
||||||
* @filename - requested filename in /lib/firmware/cis/
|
* @filename - requested filename in /lib/firmware/
|
||||||
*
|
*
|
||||||
* This uses the in-kernel firmware loading mechanism to use a "fake CIS" if
|
* This uses the in-kernel firmware loading mechanism to use a "fake CIS" if
|
||||||
* the one provided by the card is broken. The firmware files reside in
|
* the one provided by the card is broken. The firmware files reside in
|
||||||
* /lib/firmware/cis/ in userspace.
|
* /lib/firmware/ in userspace.
|
||||||
*/
|
*/
|
||||||
static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename)
|
static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename)
|
||||||
{
|
{
|
||||||
|
@ -298,9 +298,6 @@ static inline int pcmcia_load_firmware(struct pcmcia_device *dev, char * filenam
|
||||||
*
|
*
|
||||||
* Registers a PCMCIA driver with the PCMCIA bus core.
|
* Registers a PCMCIA driver with the PCMCIA bus core.
|
||||||
*/
|
*/
|
||||||
static int pcmcia_device_probe(struct device *dev);
|
|
||||||
static int pcmcia_device_remove(struct device * dev);
|
|
||||||
|
|
||||||
int pcmcia_register_driver(struct pcmcia_driver *driver)
|
int pcmcia_register_driver(struct pcmcia_driver *driver)
|
||||||
{
|
{
|
||||||
if (!driver)
|
if (!driver)
|
||||||
|
@ -400,7 +397,7 @@ static int pcmcia_device_probe(struct device * dev)
|
||||||
* call which will then check whether there are two
|
* call which will then check whether there are two
|
||||||
* pseudo devices, and if not, add the second one.
|
* pseudo devices, and if not, add the second one.
|
||||||
*/
|
*/
|
||||||
did = (struct pcmcia_device_id *) p_dev->dev.driver_data;
|
did = p_dev->dev.driver_data;
|
||||||
if (did && (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) &&
|
if (did && (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) &&
|
||||||
(p_dev->socket->device_count == 1) && (p_dev->device_no == 0))
|
(p_dev->socket->device_count == 1) && (p_dev->device_no == 0))
|
||||||
pcmcia_add_pseudo_device(p_dev->socket);
|
pcmcia_add_pseudo_device(p_dev->socket);
|
||||||
|
@ -448,7 +445,6 @@ static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *le
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int pcmcia_device_remove(struct device * dev)
|
static int pcmcia_device_remove(struct device * dev)
|
||||||
{
|
{
|
||||||
struct pcmcia_device *p_dev;
|
struct pcmcia_device *p_dev;
|
||||||
|
@ -463,7 +459,7 @@ static int pcmcia_device_remove(struct device * dev)
|
||||||
* pseudo multi-function card, we need to unbind
|
* pseudo multi-function card, we need to unbind
|
||||||
* all devices
|
* all devices
|
||||||
*/
|
*/
|
||||||
did = (struct pcmcia_device_id *) p_dev->dev.driver_data;
|
did = p_dev->dev.driver_data;
|
||||||
if (did && (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) &&
|
if (did && (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) &&
|
||||||
(p_dev->socket->device_count != 0) &&
|
(p_dev->socket->device_count != 0) &&
|
||||||
(p_dev->device_no == 0))
|
(p_dev->device_no == 0))
|
||||||
|
@ -476,6 +472,8 @@ static int pcmcia_device_remove(struct device * dev)
|
||||||
if (p_drv->remove)
|
if (p_drv->remove)
|
||||||
p_drv->remove(p_dev);
|
p_drv->remove(p_dev);
|
||||||
|
|
||||||
|
p_dev->dev_node = NULL;
|
||||||
|
|
||||||
/* check for proper unloading */
|
/* check for proper unloading */
|
||||||
if (p_dev->_irq || p_dev->_io || p_dev->_locked)
|
if (p_dev->_irq || p_dev->_io || p_dev->_locked)
|
||||||
printk(KERN_INFO "pcmcia: driver %s did not release config properly\n",
|
printk(KERN_INFO "pcmcia: driver %s did not release config properly\n",
|
||||||
|
@ -628,7 +626,7 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add to the list in pcmcia_bus_socket */
|
/* Add to the list in pcmcia_bus_socket */
|
||||||
list_add_tail(&p_dev->socket_device_list, &s->devices_list);
|
list_add(&p_dev->socket_device_list, &s->devices_list);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
|
spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,6 @@ static int alloc_io_space(struct pcmcia_socket *s, u_int attr, ioaddr_t *base,
|
||||||
}
|
}
|
||||||
if ((s->features & SS_CAP_STATIC_MAP) && s->io_offset) {
|
if ((s->features & SS_CAP_STATIC_MAP) && s->io_offset) {
|
||||||
*base = s->io_offset | (*base & 0x0fff);
|
*base = s->io_offset | (*base & 0x0fff);
|
||||||
s->io[0].res->flags = (s->io[0].res->flags & ~IORESOURCE_BITS) | (attr & IORESOURCE_BITS);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* Check for an already-allocated window that must conflict with
|
/* Check for an already-allocated window that must conflict with
|
||||||
|
@ -209,7 +208,6 @@ int pccard_get_configuration_info(struct pcmcia_socket *s,
|
||||||
if (!(s->state & SOCKET_PRESENT))
|
if (!(s->state & SOCKET_PRESENT))
|
||||||
return CS_NO_CARD;
|
return CS_NO_CARD;
|
||||||
|
|
||||||
config->Function = p_dev->func;
|
|
||||||
|
|
||||||
#ifdef CONFIG_CARDBUS
|
#ifdef CONFIG_CARDBUS
|
||||||
if (s->state & SOCKET_CARDBUS) {
|
if (s->state & SOCKET_CARDBUS) {
|
||||||
|
@ -223,14 +221,22 @@ int pccard_get_configuration_info(struct pcmcia_socket *s,
|
||||||
config->AssignedIRQ = s->irq.AssignedIRQ;
|
config->AssignedIRQ = s->irq.AssignedIRQ;
|
||||||
if (config->AssignedIRQ)
|
if (config->AssignedIRQ)
|
||||||
config->Attributes |= CONF_ENABLE_IRQ;
|
config->Attributes |= CONF_ENABLE_IRQ;
|
||||||
config->BasePort1 = s->io[0].res->start;
|
if (s->io[0].res) {
|
||||||
config->NumPorts1 = s->io[0].res->end - config->BasePort1 + 1;
|
config->BasePort1 = s->io[0].res->start;
|
||||||
|
config->NumPorts1 = s->io[0].res->end - config->BasePort1 + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return CS_SUCCESS;
|
return CS_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
c = (p_dev) ? p_dev->function_config : NULL;
|
if (p_dev) {
|
||||||
|
c = p_dev->function_config;
|
||||||
|
config->Function = p_dev->func;
|
||||||
|
} else {
|
||||||
|
c = NULL;
|
||||||
|
config->Function = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if ((c == NULL) || !(c->state & CONFIG_LOCKED)) {
|
if ((c == NULL) || !(c->state & CONFIG_LOCKED)) {
|
||||||
config->Attributes = 0;
|
config->Attributes = 0;
|
||||||
|
@ -947,7 +953,5 @@ void pcmcia_disable_device(struct pcmcia_device *p_dev) {
|
||||||
pcmcia_release_irq(p_dev, &p_dev->irq);
|
pcmcia_release_irq(p_dev, &p_dev->irq);
|
||||||
if (&p_dev->win)
|
if (&p_dev->win)
|
||||||
pcmcia_release_window(p_dev->win);
|
pcmcia_release_window(p_dev->win);
|
||||||
|
|
||||||
p_dev->dev_node = NULL;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pcmcia_disable_device);
|
EXPORT_SYMBOL(pcmcia_disable_device);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче