diff options
Diffstat (limited to 'drivers/usb/atm/cxacru.c')
| -rw-r--r-- | drivers/usb/atm/cxacru.c | 92 | 
1 files changed, 44 insertions, 48 deletions
| diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c index af0a41e7870e..04631dcbabbc 100644 --- a/drivers/usb/atm/cxacru.c +++ b/drivers/usb/atm/cxacru.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/init.h> | 36 | #include <linux/init.h> | 
| 37 | #include <linux/device.h> /* FIXME: linux/firmware.h should include it itself */ | 37 | #include <linux/device.h> /* FIXME: linux/firmware.h should include it itself */ | 
| 38 | #include <linux/firmware.h> | 38 | #include <linux/firmware.h> | 
| 39 | #include <linux/mutex.h> | ||
| 39 | 40 | ||
| 40 | #include "usbatm.h" | 41 | #include "usbatm.h" | 
| 41 | 42 | ||
| @@ -160,7 +161,7 @@ struct cxacru_data { | |||
| 160 | struct work_struct poll_work; | 161 | struct work_struct poll_work; | 
| 161 | 162 | ||
| 162 | /* contol handles */ | 163 | /* contol handles */ | 
| 163 | struct semaphore cm_serialize; | 164 | struct mutex cm_serialize; | 
| 164 | u8 *rcv_buf; | 165 | u8 *rcv_buf; | 
| 165 | u8 *snd_buf; | 166 | u8 *snd_buf; | 
| 166 | struct urb *rcv_urb; | 167 | struct urb *rcv_urb; | 
| @@ -219,7 +220,7 @@ static int cxacru_cm(struct cxacru_data *instance, enum cxacru_cm_request cm, | |||
| 219 | goto fail; | 220 | goto fail; | 
| 220 | } | 221 | } | 
| 221 | 222 | ||
| 222 | down(&instance->cm_serialize); | 223 | mutex_lock(&instance->cm_serialize); | 
| 223 | 224 | ||
| 224 | /* submit reading urb before the writing one */ | 225 | /* submit reading urb before the writing one */ | 
| 225 | init_completion(&instance->rcv_done); | 226 | init_completion(&instance->rcv_done); | 
| @@ -288,7 +289,7 @@ static int cxacru_cm(struct cxacru_data *instance, enum cxacru_cm_request cm, | |||
| 288 | ret = offd; | 289 | ret = offd; | 
| 289 | dbg("cm %#x", cm); | 290 | dbg("cm %#x", cm); | 
| 290 | fail: | 291 | fail: | 
| 291 | up(&instance->cm_serialize); | 292 | mutex_unlock(&instance->cm_serialize); | 
| 292 | return ret; | 293 | return ret; | 
| 293 | } | 294 | } | 
| 294 | 295 | ||
| @@ -352,7 +353,6 @@ static int cxacru_atm_start(struct usbatm_data *usbatm_instance, | |||
| 352 | struct atm_dev *atm_dev) | 353 | struct atm_dev *atm_dev) | 
| 353 | { | 354 | { | 
| 354 | struct cxacru_data *instance = usbatm_instance->driver_data; | 355 | struct cxacru_data *instance = usbatm_instance->driver_data; | 
| 355 | struct device *dev = &usbatm_instance->usb_intf->dev; | ||
| 356 | /* | 356 | /* | 
| 357 | struct atm_dev *atm_dev = usbatm_instance->atm_dev; | 357 | struct atm_dev *atm_dev = usbatm_instance->atm_dev; | 
| 358 | */ | 358 | */ | 
| @@ -364,14 +364,14 @@ static int cxacru_atm_start(struct usbatm_data *usbatm_instance, | |||
| 364 | ret = cxacru_cm(instance, CM_REQUEST_CARD_GET_MAC_ADDRESS, NULL, 0, | 364 | ret = cxacru_cm(instance, CM_REQUEST_CARD_GET_MAC_ADDRESS, NULL, 0, | 
| 365 | atm_dev->esi, sizeof(atm_dev->esi)); | 365 | atm_dev->esi, sizeof(atm_dev->esi)); | 
| 366 | if (ret < 0) { | 366 | if (ret < 0) { | 
| 367 | dev_err(dev, "cxacru_atm_start: CARD_GET_MAC_ADDRESS returned %d\n", ret); | 367 | atm_err(usbatm_instance, "cxacru_atm_start: CARD_GET_MAC_ADDRESS returned %d\n", ret); | 
| 368 | return ret; | 368 | return ret; | 
| 369 | } | 369 | } | 
| 370 | 370 | ||
| 371 | /* start ADSL */ | 371 | /* start ADSL */ | 
| 372 | ret = cxacru_cm(instance, CM_REQUEST_CHIP_ADSL_LINE_START, NULL, 0, NULL, 0); | 372 | ret = cxacru_cm(instance, CM_REQUEST_CHIP_ADSL_LINE_START, NULL, 0, NULL, 0); | 
| 373 | if (ret < 0) { | 373 | if (ret < 0) { | 
| 374 | dev_err(dev, "cxacru_atm_start: CHIP_ADSL_LINE_START returned %d\n", ret); | 374 | atm_err(usbatm_instance, "cxacru_atm_start: CHIP_ADSL_LINE_START returned %d\n", ret); | 
| 375 | return ret; | 375 | return ret; | 
| 376 | } | 376 | } | 
| 377 | 377 | ||
| @@ -383,13 +383,13 @@ static int cxacru_atm_start(struct usbatm_data *usbatm_instance, | |||
| 383 | static void cxacru_poll_status(struct cxacru_data *instance) | 383 | static void cxacru_poll_status(struct cxacru_data *instance) | 
| 384 | { | 384 | { | 
| 385 | u32 buf[CXINF_MAX] = {}; | 385 | u32 buf[CXINF_MAX] = {}; | 
| 386 | struct device *dev = &instance->usbatm->usb_intf->dev; | 386 | struct usbatm_data *usbatm = instance->usbatm; | 
| 387 | struct atm_dev *atm_dev = instance->usbatm->atm_dev; | 387 | struct atm_dev *atm_dev = usbatm->atm_dev; | 
| 388 | int ret; | 388 | int ret; | 
| 389 | 389 | ||
| 390 | ret = cxacru_cm_get_array(instance, CM_REQUEST_CARD_INFO_GET, buf, CXINF_MAX); | 390 | ret = cxacru_cm_get_array(instance, CM_REQUEST_CARD_INFO_GET, buf, CXINF_MAX); | 
| 391 | if (ret < 0) { | 391 | if (ret < 0) { | 
| 392 | dev_warn(dev, "poll status: error %d\n", ret); | 392 | atm_warn(usbatm, "poll status: error %d\n", ret); | 
| 393 | goto reschedule; | 393 | goto reschedule; | 
| 394 | } | 394 | } | 
| 395 | 395 | ||
| @@ -400,50 +400,50 @@ static void cxacru_poll_status(struct cxacru_data *instance) | |||
| 400 | switch (instance->line_status) { | 400 | switch (instance->line_status) { | 
| 401 | case 0: | 401 | case 0: | 
| 402 | atm_dev->signal = ATM_PHY_SIG_LOST; | 402 | atm_dev->signal = ATM_PHY_SIG_LOST; | 
| 403 | dev_info(dev, "ADSL line: down\n"); | 403 | atm_info(usbatm, "ADSL line: down\n"); | 
| 404 | break; | 404 | break; | 
| 405 | 405 | ||
| 406 | case 1: | 406 | case 1: | 
| 407 | atm_dev->signal = ATM_PHY_SIG_LOST; | 407 | atm_dev->signal = ATM_PHY_SIG_LOST; | 
| 408 | dev_info(dev, "ADSL line: attemtping to activate\n"); | 408 | atm_info(usbatm, "ADSL line: attempting to activate\n"); | 
| 409 | break; | 409 | break; | 
| 410 | 410 | ||
| 411 | case 2: | 411 | case 2: | 
| 412 | atm_dev->signal = ATM_PHY_SIG_LOST; | 412 | atm_dev->signal = ATM_PHY_SIG_LOST; | 
| 413 | dev_info(dev, "ADSL line: training\n"); | 413 | atm_info(usbatm, "ADSL line: training\n"); | 
| 414 | break; | 414 | break; | 
| 415 | 415 | ||
| 416 | case 3: | 416 | case 3: | 
| 417 | atm_dev->signal = ATM_PHY_SIG_LOST; | 417 | atm_dev->signal = ATM_PHY_SIG_LOST; | 
| 418 | dev_info(dev, "ADSL line: channel analysis\n"); | 418 | atm_info(usbatm, "ADSL line: channel analysis\n"); | 
| 419 | break; | 419 | break; | 
| 420 | 420 | ||
| 421 | case 4: | 421 | case 4: | 
| 422 | atm_dev->signal = ATM_PHY_SIG_LOST; | 422 | atm_dev->signal = ATM_PHY_SIG_LOST; | 
| 423 | dev_info(dev, "ADSL line: exchange\n"); | 423 | atm_info(usbatm, "ADSL line: exchange\n"); | 
| 424 | break; | 424 | break; | 
| 425 | 425 | ||
| 426 | case 5: | 426 | case 5: | 
| 427 | atm_dev->link_rate = buf[CXINF_DOWNSTREAM_RATE] * 1000 / 424; | 427 | atm_dev->link_rate = buf[CXINF_DOWNSTREAM_RATE] * 1000 / 424; | 
| 428 | atm_dev->signal = ATM_PHY_SIG_FOUND; | 428 | atm_dev->signal = ATM_PHY_SIG_FOUND; | 
| 429 | 429 | ||
| 430 | dev_info(dev, "ADSL line: up (%d kb/s down | %d kb/s up)\n", | 430 | atm_info(usbatm, "ADSL line: up (%d kb/s down | %d kb/s up)\n", | 
| 431 | buf[CXINF_DOWNSTREAM_RATE], buf[CXINF_UPSTREAM_RATE]); | 431 | buf[CXINF_DOWNSTREAM_RATE], buf[CXINF_UPSTREAM_RATE]); | 
| 432 | break; | 432 | break; | 
| 433 | 433 | ||
| 434 | case 6: | 434 | case 6: | 
| 435 | atm_dev->signal = ATM_PHY_SIG_LOST; | 435 | atm_dev->signal = ATM_PHY_SIG_LOST; | 
| 436 | dev_info(dev, "ADSL line: waiting\n"); | 436 | atm_info(usbatm, "ADSL line: waiting\n"); | 
| 437 | break; | 437 | break; | 
| 438 | 438 | ||
| 439 | case 7: | 439 | case 7: | 
| 440 | atm_dev->signal = ATM_PHY_SIG_LOST; | 440 | atm_dev->signal = ATM_PHY_SIG_LOST; | 
| 441 | dev_info(dev, "ADSL line: initializing\n"); | 441 | atm_info(usbatm, "ADSL line: initializing\n"); | 
| 442 | break; | 442 | break; | 
| 443 | 443 | ||
| 444 | default: | 444 | default: | 
| 445 | atm_dev->signal = ATM_PHY_SIG_UNKNOWN; | 445 | atm_dev->signal = ATM_PHY_SIG_UNKNOWN; | 
| 446 | dev_info(dev, "Unknown line state %02x\n", instance->line_status); | 446 | atm_info(usbatm, "Unknown line state %02x\n", instance->line_status); | 
| 447 | break; | 447 | break; | 
| 448 | } | 448 | } | 
| 449 | reschedule: | 449 | reschedule: | 
| @@ -504,8 +504,8 @@ static void cxacru_upload_firmware(struct cxacru_data *instance, | |||
| 504 | { | 504 | { | 
| 505 | int ret; | 505 | int ret; | 
| 506 | int off; | 506 | int off; | 
| 507 | struct usb_device *usb_dev = instance->usbatm->usb_dev; | 507 | struct usbatm_data *usbatm = instance->usbatm; | 
| 508 | struct device *dev = &instance->usbatm->usb_intf->dev; | 508 | struct usb_device *usb_dev = usbatm->usb_dev; | 
| 509 | u16 signature[] = { usb_dev->descriptor.idVendor, usb_dev->descriptor.idProduct }; | 509 | u16 signature[] = { usb_dev->descriptor.idVendor, usb_dev->descriptor.idProduct }; | 
| 510 | u32 val; | 510 | u32 val; | 
| 511 | 511 | ||
| @@ -515,7 +515,7 @@ static void cxacru_upload_firmware(struct cxacru_data *instance, | |||
| 515 | val = cpu_to_le32(instance->modem_type->pll_f_clk); | 515 | val = cpu_to_le32(instance->modem_type->pll_f_clk); | 
| 516 | ret = cxacru_fw(usb_dev, FW_WRITE_MEM, 0x2, 0x0, PLLFCLK_ADDR, (u8 *) &val, 4); | 516 | ret = cxacru_fw(usb_dev, FW_WRITE_MEM, 0x2, 0x0, PLLFCLK_ADDR, (u8 *) &val, 4); | 
| 517 | if (ret) { | 517 | if (ret) { | 
| 518 | dev_err(dev, "FirmwarePllFClkValue failed: %d\n", ret); | 518 | usb_err(usbatm, "FirmwarePllFClkValue failed: %d\n", ret); | 
| 519 | return; | 519 | return; | 
| 520 | } | 520 | } | 
| 521 | 521 | ||
| @@ -523,7 +523,7 @@ static void cxacru_upload_firmware(struct cxacru_data *instance, | |||
| 523 | val = cpu_to_le32(instance->modem_type->pll_b_clk); | 523 | val = cpu_to_le32(instance->modem_type->pll_b_clk); | 
| 524 | ret = cxacru_fw(usb_dev, FW_WRITE_MEM, 0x2, 0x0, PLLBCLK_ADDR, (u8 *) &val, 4); | 524 | ret = cxacru_fw(usb_dev, FW_WRITE_MEM, 0x2, 0x0, PLLBCLK_ADDR, (u8 *) &val, 4); | 
| 525 | if (ret) { | 525 | if (ret) { | 
| 526 | dev_err(dev, "FirmwarePllBClkValue failed: %d\n", ret); | 526 | usb_err(usbatm, "FirmwarePllBClkValue failed: %d\n", ret); | 
| 527 | return; | 527 | return; | 
| 528 | } | 528 | } | 
| 529 | 529 | ||
| @@ -531,14 +531,14 @@ static void cxacru_upload_firmware(struct cxacru_data *instance, | |||
| 531 | val = cpu_to_le32(SDRAM_ENA); | 531 | val = cpu_to_le32(SDRAM_ENA); | 
| 532 | ret = cxacru_fw(usb_dev, FW_WRITE_MEM, 0x2, 0x0, SDRAMEN_ADDR, (u8 *) &val, 4); | 532 | ret = cxacru_fw(usb_dev, FW_WRITE_MEM, 0x2, 0x0, SDRAMEN_ADDR, (u8 *) &val, 4); | 
| 533 | if (ret) { | 533 | if (ret) { | 
| 534 | dev_err(dev, "Enable SDRAM failed: %d\n", ret); | 534 | usb_err(usbatm, "Enable SDRAM failed: %d\n", ret); | 
| 535 | return; | 535 | return; | 
| 536 | } | 536 | } | 
| 537 | 537 | ||
| 538 | /* Firmware */ | 538 | /* Firmware */ | 
| 539 | ret = cxacru_fw(usb_dev, FW_WRITE_MEM, 0x2, 0x0, FW_ADDR, fw->data, fw->size); | 539 | ret = cxacru_fw(usb_dev, FW_WRITE_MEM, 0x2, 0x0, FW_ADDR, fw->data, fw->size); | 
| 540 | if (ret) { | 540 | if (ret) { | 
| 541 | dev_err(dev, "Firmware upload failed: %d\n", ret); | 541 | usb_err(usbatm, "Firmware upload failed: %d\n", ret); | 
| 542 | return; | 542 | return; | 
| 543 | } | 543 | } | 
| 544 | 544 | ||
| @@ -546,7 +546,7 @@ static void cxacru_upload_firmware(struct cxacru_data *instance, | |||
| 546 | if (instance->modem_type->boot_rom_patch) { | 546 | if (instance->modem_type->boot_rom_patch) { | 
| 547 | ret = cxacru_fw(usb_dev, FW_WRITE_MEM, 0x2, 0x0, BR_ADDR, bp->data, bp->size); | 547 | ret = cxacru_fw(usb_dev, FW_WRITE_MEM, 0x2, 0x0, BR_ADDR, bp->data, bp->size); | 
| 548 | if (ret) { | 548 | if (ret) { | 
| 549 | dev_err(dev, "Boot ROM patching failed: %d\n", ret); | 549 | usb_err(usbatm, "Boot ROM patching failed: %d\n", ret); | 
| 550 | return; | 550 | return; | 
| 551 | } | 551 | } | 
| 552 | } | 552 | } | 
| @@ -554,7 +554,7 @@ static void cxacru_upload_firmware(struct cxacru_data *instance, | |||
| 554 | /* Signature */ | 554 | /* Signature */ | 
| 555 | ret = cxacru_fw(usb_dev, FW_WRITE_MEM, 0x2, 0x0, SIG_ADDR, (u8 *) signature, 4); | 555 | ret = cxacru_fw(usb_dev, FW_WRITE_MEM, 0x2, 0x0, SIG_ADDR, (u8 *) signature, 4); | 
| 556 | if (ret) { | 556 | if (ret) { | 
| 557 | dev_err(dev, "Signature storing failed: %d\n", ret); | 557 | usb_err(usbatm, "Signature storing failed: %d\n", ret); | 
| 558 | return; | 558 | return; | 
| 559 | } | 559 | } | 
| 560 | 560 | ||
| @@ -566,7 +566,7 @@ static void cxacru_upload_firmware(struct cxacru_data *instance, | |||
| 566 | ret = cxacru_fw(usb_dev, FW_GOTO_MEM, 0x0, 0x0, FW_ADDR, NULL, 0); | 566 | ret = cxacru_fw(usb_dev, FW_GOTO_MEM, 0x0, 0x0, FW_ADDR, NULL, 0); | 
| 567 | } | 567 | } | 
| 568 | if (ret) { | 568 | if (ret) { | 
| 569 | dev_err(dev, "Passing control to firmware failed: %d\n", ret); | 569 | usb_err(usbatm, "Passing control to firmware failed: %d\n", ret); | 
| 570 | return; | 570 | return; | 
| 571 | } | 571 | } | 
| 572 | 572 | ||
| @@ -580,7 +580,7 @@ static void cxacru_upload_firmware(struct cxacru_data *instance, | |||
| 580 | 580 | ||
| 581 | ret = cxacru_cm(instance, CM_REQUEST_CARD_GET_STATUS, NULL, 0, NULL, 0); | 581 | ret = cxacru_cm(instance, CM_REQUEST_CARD_GET_STATUS, NULL, 0, NULL, 0); | 
| 582 | if (ret < 0) { | 582 | if (ret < 0) { | 
| 583 | dev_err(dev, "modem failed to initialize: %d\n", ret); | 583 | usb_err(usbatm, "modem failed to initialize: %d\n", ret); | 
| 584 | return; | 584 | return; | 
| 585 | } | 585 | } | 
| 586 | 586 | ||
| @@ -597,7 +597,7 @@ static void cxacru_upload_firmware(struct cxacru_data *instance, | |||
| 597 | ret = cxacru_cm(instance, CM_REQUEST_CARD_DATA_SET, | 597 | ret = cxacru_cm(instance, CM_REQUEST_CARD_DATA_SET, | 
| 598 | (u8 *) buf, len, NULL, 0); | 598 | (u8 *) buf, len, NULL, 0); | 
| 599 | if (ret < 0) { | 599 | if (ret < 0) { | 
| 600 | dev_err(dev, "load config data failed: %d\n", ret); | 600 | usb_err(usbatm, "load config data failed: %d\n", ret); | 
| 601 | return; | 601 | return; | 
| 602 | } | 602 | } | 
| 603 | } | 603 | } | 
| @@ -608,18 +608,19 @@ static void cxacru_upload_firmware(struct cxacru_data *instance, | |||
| 608 | static int cxacru_find_firmware(struct cxacru_data *instance, | 608 | static int cxacru_find_firmware(struct cxacru_data *instance, | 
| 609 | char* phase, const struct firmware **fw_p) | 609 | char* phase, const struct firmware **fw_p) | 
| 610 | { | 610 | { | 
| 611 | struct device *dev = &instance->usbatm->usb_intf->dev; | 611 | struct usbatm_data *usbatm = instance->usbatm; | 
| 612 | struct device *dev = &usbatm->usb_intf->dev; | ||
| 612 | char buf[16]; | 613 | char buf[16]; | 
| 613 | 614 | ||
| 614 | sprintf(buf, "cxacru-%s.bin", phase); | 615 | sprintf(buf, "cxacru-%s.bin", phase); | 
| 615 | dbg("cxacru_find_firmware: looking for %s", buf); | 616 | dbg("cxacru_find_firmware: looking for %s", buf); | 
| 616 | 617 | ||
| 617 | if (request_firmware(fw_p, buf, dev)) { | 618 | if (request_firmware(fw_p, buf, dev)) { | 
| 618 | dev_dbg(dev, "no stage %s firmware found\n", phase); | 619 | usb_dbg(usbatm, "no stage %s firmware found\n", phase); | 
| 619 | return -ENOENT; | 620 | return -ENOENT; | 
| 620 | } | 621 | } | 
| 621 | 622 | ||
| 622 | dev_info(dev, "found firmware %s\n", buf); | 623 | usb_info(usbatm, "found firmware %s\n", buf); | 
| 623 | 624 | ||
| 624 | return 0; | 625 | return 0; | 
| 625 | } | 626 | } | 
| @@ -627,20 +628,19 @@ static int cxacru_find_firmware(struct cxacru_data *instance, | |||
| 627 | static int cxacru_heavy_init(struct usbatm_data *usbatm_instance, | 628 | static int cxacru_heavy_init(struct usbatm_data *usbatm_instance, | 
| 628 | struct usb_interface *usb_intf) | 629 | struct usb_interface *usb_intf) | 
| 629 | { | 630 | { | 
| 630 | struct device *dev = &usbatm_instance->usb_intf->dev; | ||
| 631 | const struct firmware *fw, *bp, *cf; | 631 | const struct firmware *fw, *bp, *cf; | 
| 632 | struct cxacru_data *instance = usbatm_instance->driver_data; | 632 | struct cxacru_data *instance = usbatm_instance->driver_data; | 
| 633 | 633 | ||
| 634 | int ret = cxacru_find_firmware(instance, "fw", &fw); | 634 | int ret = cxacru_find_firmware(instance, "fw", &fw); | 
| 635 | if (ret) { | 635 | if (ret) { | 
| 636 | dev_warn(dev, "firmware (cxacru-fw.bin) unavailable (hotplug misconfiguration?)\n"); | 636 | usb_warn(usbatm_instance, "firmware (cxacru-fw.bin) unavailable (system misconfigured?)\n"); | 
| 637 | return ret; | 637 | return ret; | 
| 638 | } | 638 | } | 
| 639 | 639 | ||
| 640 | if (instance->modem_type->boot_rom_patch) { | 640 | if (instance->modem_type->boot_rom_patch) { | 
| 641 | ret = cxacru_find_firmware(instance, "bp", &bp); | 641 | ret = cxacru_find_firmware(instance, "bp", &bp); | 
| 642 | if (ret) { | 642 | if (ret) { | 
| 643 | dev_warn(dev, "boot ROM patch (cxacru-bp.bin) unavailable (hotplug misconfiguration?)\n"); | 643 | usb_warn(usbatm_instance, "boot ROM patch (cxacru-bp.bin) unavailable (system misconfigured?)\n"); | 
| 644 | release_firmware(fw); | 644 | release_firmware(fw); | 
| 645 | return ret; | 645 | return ret; | 
| 646 | } | 646 | } | 
| @@ -667,22 +667,19 @@ static int cxacru_heavy_init(struct usbatm_data *usbatm_instance, | |||
| 667 | } | 667 | } | 
| 668 | 668 | ||
| 669 | static int cxacru_bind(struct usbatm_data *usbatm_instance, | 669 | static int cxacru_bind(struct usbatm_data *usbatm_instance, | 
| 670 | struct usb_interface *intf, const struct usb_device_id *id, | 670 | struct usb_interface *intf, const struct usb_device_id *id) | 
| 671 | int *need_heavy_init) | ||
| 672 | { | 671 | { | 
| 673 | struct cxacru_data *instance; | 672 | struct cxacru_data *instance; | 
| 674 | struct usb_device *usb_dev = interface_to_usbdev(intf); | 673 | struct usb_device *usb_dev = interface_to_usbdev(intf); | 
| 675 | int ret; | 674 | int ret; | 
| 676 | 675 | ||
| 677 | /* instance init */ | 676 | /* instance init */ | 
| 678 | instance = kmalloc(sizeof(*instance), GFP_KERNEL); | 677 | instance = kzalloc(sizeof(*instance), GFP_KERNEL); | 
| 679 | if (!instance) { | 678 | if (!instance) { | 
| 680 | dbg("cxacru_bind: no memory for instance data"); | 679 | dbg("cxacru_bind: no memory for instance data"); | 
| 681 | return -ENOMEM; | 680 | return -ENOMEM; | 
| 682 | } | 681 | } | 
| 683 | 682 | ||
| 684 | memset(instance, 0, sizeof(*instance)); | ||
| 685 | |||
| 686 | instance->usbatm = usbatm_instance; | 683 | instance->usbatm = usbatm_instance; | 
| 687 | instance->modem_type = (struct cxacru_modem_type *) id->driver_info; | 684 | instance->modem_type = (struct cxacru_modem_type *) id->driver_info; | 
| 688 | 685 | ||
| @@ -721,13 +718,13 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance, | |||
| 721 | instance->snd_buf, PAGE_SIZE, | 718 | instance->snd_buf, PAGE_SIZE, | 
| 722 | cxacru_blocking_completion, &instance->snd_done, 4); | 719 | cxacru_blocking_completion, &instance->snd_done, 4); | 
| 723 | 720 | ||
| 724 | init_MUTEX(&instance->cm_serialize); | 721 | mutex_init(&instance->cm_serialize); | 
| 725 | 722 | ||
| 726 | INIT_WORK(&instance->poll_work, (void *)cxacru_poll_status, instance); | 723 | INIT_WORK(&instance->poll_work, (void *)cxacru_poll_status, instance); | 
| 727 | 724 | ||
| 728 | usbatm_instance->driver_data = instance; | 725 | usbatm_instance->driver_data = instance; | 
| 729 | 726 | ||
| 730 | *need_heavy_init = cxacru_card_status(instance); | 727 | usbatm_instance->flags = (cxacru_card_status(instance) ? 0 : UDSL_SKIP_HEAVY_INIT); | 
| 731 | 728 | ||
| 732 | return 0; | 729 | return 0; | 
| 733 | 730 | ||
| @@ -787,12 +784,12 @@ static const struct usb_device_id cxacru_usb_ids[] = { | |||
| 787 | { /* V = Conexant P = ADSL modem (Hasbani project) */ | 784 | { /* V = Conexant P = ADSL modem (Hasbani project) */ | 
| 788 | USB_DEVICE(0x0572, 0xcb00), .driver_info = (unsigned long) &cxacru_cb00 | 785 | USB_DEVICE(0x0572, 0xcb00), .driver_info = (unsigned long) &cxacru_cb00 | 
| 789 | }, | 786 | }, | 
| 790 | { /* V = Conexant P = ADSL modem (Well PTI-800 */ | ||
| 791 | USB_DEVICE(0x0572, 0xcb02), .driver_info = (unsigned long) &cxacru_cb00 | ||
| 792 | }, | ||
| 793 | { /* V = Conexant P = ADSL modem */ | 787 | { /* V = Conexant P = ADSL modem */ | 
| 794 | USB_DEVICE(0x0572, 0xcb01), .driver_info = (unsigned long) &cxacru_cb00 | 788 | USB_DEVICE(0x0572, 0xcb01), .driver_info = (unsigned long) &cxacru_cb00 | 
| 795 | }, | 789 | }, | 
| 790 | { /* V = Conexant P = ADSL modem (Well PTI-800) */ | ||
| 791 | USB_DEVICE(0x0572, 0xcb02), .driver_info = (unsigned long) &cxacru_cb00 | ||
| 792 | }, | ||
| 796 | { /* V = Conexant P = ADSL modem */ | 793 | { /* V = Conexant P = ADSL modem */ | 
| 797 | USB_DEVICE(0x0572, 0xcb06), .driver_info = (unsigned long) &cxacru_cb00 | 794 | USB_DEVICE(0x0572, 0xcb06), .driver_info = (unsigned long) &cxacru_cb00 | 
| 798 | }, | 795 | }, | 
| @@ -835,14 +832,13 @@ static const struct usb_device_id cxacru_usb_ids[] = { | |||
| 835 | MODULE_DEVICE_TABLE(usb, cxacru_usb_ids); | 832 | MODULE_DEVICE_TABLE(usb, cxacru_usb_ids); | 
| 836 | 833 | ||
| 837 | static struct usbatm_driver cxacru_driver = { | 834 | static struct usbatm_driver cxacru_driver = { | 
| 838 | .owner = THIS_MODULE, | ||
| 839 | .driver_name = cxacru_driver_name, | 835 | .driver_name = cxacru_driver_name, | 
| 840 | .bind = cxacru_bind, | 836 | .bind = cxacru_bind, | 
| 841 | .heavy_init = cxacru_heavy_init, | 837 | .heavy_init = cxacru_heavy_init, | 
| 842 | .unbind = cxacru_unbind, | 838 | .unbind = cxacru_unbind, | 
| 843 | .atm_start = cxacru_atm_start, | 839 | .atm_start = cxacru_atm_start, | 
| 844 | .in = CXACRU_EP_DATA, | 840 | .bulk_in = CXACRU_EP_DATA, | 
| 845 | .out = CXACRU_EP_DATA, | 841 | .bulk_out = CXACRU_EP_DATA, | 
| 846 | .rx_padding = 3, | 842 | .rx_padding = 3, | 
| 847 | .tx_padding = 11, | 843 | .tx_padding = 11, | 
| 848 | }; | 844 | }; | 
