kernels/linux-2.4.0/drivers/isdn/avmb1/avm_cs.c
/*======================================================================

    avmcs_attach() creates an "instance" of the driver, allocating
    local data structures for one device.  The device is registered
    with Card Services.

    The dev_link structure is initialized, but we don't actually
    configure the card at this point -- we wait until we receive a
    card insertion event.
    
======================================================================*/
avmcs_attach() creates an "instance" of the driver, allocating
local data structures for one device.  The device is registered
with Card Services.

The dev_link structure is initialized, but we don't actually
configure the card at this point -- we wait until we receive a
card insertion event.
avmcs_attach () creates an " instance " of the driver allocating local data structures for one device . The device is registered with Card Services . The dev_link structure is initialized but we don ' t actually configure the card at this point -- we wait until we receive a card insertion event .
static dev_link_t *avmcs_attach(void)
{
    client_reg_t client_reg;
    dev_link_t *link;
    local_info_t *local;
    int ret, i;
    link = kmalloc(sizeof(struct dev_link_t), GFP_KERNEL);
    memset(link, 0, sizeof(struct dev_link_t));
    link->release.function = &avmcs_release;
    link->release.data = (u_long)link;
    link->io.NumPorts1 = 16;
    link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
    link->io.NumPorts2 = 0;
    link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
    link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED;
    link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID;
    if (irq_list[0] != -1) {
	    for (i = 0; i < 10 && irq_list[i] > 0; i++)
	       link->irq.IRQInfo2 |= 1 << irq_list[i];
    } else {
	    for (i = 0; i < 10 && default_irq_list[i] > 0; i++)
	       link->irq.IRQInfo2 |= 1 << default_irq_list[i];
    }
    link->conf.Attributes = CONF_ENABLE_IRQ;
    link->conf.Vcc = 50;
    link->conf.IntType = INT_MEMORY_AND_IO;
    link->conf.ConfigIndex = 1;
    link->conf.Present = PRESENT_OPTION;
    local = kmalloc(sizeof(local_info_t), GFP_KERNEL);
    memset(local, 0, sizeof(local_info_t));
    link->priv = local;
    link->next = dev_list;
    dev_list = link;
    client_reg.dev_info = &dev_info;
    client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
    client_reg.EventMask =
	CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
	CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
	CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
    client_reg.event_handler = &avmcs_event;
    client_reg.Version = 0x0210;
    client_reg.event_callback_args.client_data = link;
    ret = CardServices(RegisterClient, &link->handle, &client_reg);
    if (ret != 0) {
	cs_error(link->handle, RegisterClient, ret);
	avmcs_detach(link);
	return NULL;
    }
    return link;
}
static dev_link_t * avmcs_attach ( void ) { client_reg_t client_reg ; dev_link_t * link ; local_info_t * local ; int ret , i ; link = kmalloc ( sizeof ( struct dev_link_t ) , GFP_KERNEL ) ; memset ( link , 0 , sizeof ( struct dev_link_t ) ) ; link -> release . function = & avmcs_release ; link -> release . data = ( u_long ) link ; link -> io . NumPorts1 = 16 ; link -> io . Attributes1 = IO_DATA_PATH_WIDTH_8 ; link -> io . NumPorts2 = 0 ; link -> irq . Attributes = IRQ_TYPE_EXCLUSIVE ; link -> irq . Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_FIRST_SHARED ; link -> irq . IRQInfo1 = IRQ_INFO2_VALID | IRQ_LEVEL_ID ; if ( irq_list [ 0 ] != -1 ) { for ( i = 0 ; i < 10 && irq_list [ i ] > 0 ; i ++ ) link -> irq . IRQInfo2 |= 1 << irq_list [ i ] ; } else { for ( i = 0 ; i < 10 && default_irq_list [ i ] > 0 ; i ++ ) link -> irq . IRQInfo2 |= 1 << default_irq_list [ i ] ; } link -> conf . Attributes = CONF_ENABLE_IRQ ; link -> conf . Vcc = 50 ; link -> conf . IntType = INT_MEMORY_AND_IO ; link -> conf . ConfigIndex = 1 ; link -> conf . Present = PRESENT_OPTION ; local = kmalloc ( sizeof ( local_info_t ) , GFP_KERNEL ) ; memset ( local , 0 , sizeof ( local_info_t ) ) ; link -> priv = local ; link -> next = dev_list ; dev_list = link ; client_reg . dev_info = & dev_info ; client_reg . Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE ; client_reg . EventMask = CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL | CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET | CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME ; client_reg . event_handler = & avmcs_event ; client_reg . Version = 0x0210 ; client_reg . event_callback_args . client_data = link ; ret = CardServices ( RegisterClient , & link -> handle , & client_reg ) ; if ( ret != 0 ) { cs_error ( link -> handle , RegisterClient , ret ) ; avmcs_detach ( link ) ; return NULL ; } return link ; }
avmcs_attach() creates an "instance" of the driver, allocating
local data structures for one device.
avmcs_attach () creates an " instance " of the driver allocating local data structures for one device .
/* Initialize the dev_link_t structure */ /* The io structure describes IO port mapping */ /* Interrupt setup */ /* General socket configuration */ /* Allocate space for private device-specific data */ /* Register with Card Services */