diff options
Diffstat (limited to 'drivers/usb/atm/ueagle-atm.c')
| -rw-r--r-- | drivers/usb/atm/ueagle-atm.c | 52 |
1 files changed, 41 insertions, 11 deletions
diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c index 830d2c982670..b38990adf1cd 100644 --- a/drivers/usb/atm/ueagle-atm.c +++ b/drivers/usb/atm/ueagle-atm.c | |||
| @@ -68,7 +68,7 @@ | |||
| 68 | 68 | ||
| 69 | #include "usbatm.h" | 69 | #include "usbatm.h" |
| 70 | 70 | ||
| 71 | #define EAGLEUSBVERSION "ueagle 1.2" | 71 | #define EAGLEUSBVERSION "ueagle 1.3" |
| 72 | 72 | ||
| 73 | 73 | ||
| 74 | /* | 74 | /* |
| @@ -243,7 +243,7 @@ enum { | |||
| 243 | #define BULK_TIMEOUT 300 | 243 | #define BULK_TIMEOUT 300 |
| 244 | #define CTRL_TIMEOUT 1000 | 244 | #define CTRL_TIMEOUT 1000 |
| 245 | 245 | ||
| 246 | #define ACK_TIMEOUT msecs_to_jiffies(1500) | 246 | #define ACK_TIMEOUT msecs_to_jiffies(3000) |
| 247 | 247 | ||
| 248 | #define UEA_INTR_IFACE_NO 0 | 248 | #define UEA_INTR_IFACE_NO 0 |
| 249 | #define UEA_US_IFACE_NO 1 | 249 | #define UEA_US_IFACE_NO 1 |
| @@ -314,6 +314,10 @@ struct cmv { | |||
| 314 | ((d) & 0xff) << 16 | \ | 314 | ((d) & 0xff) << 16 | \ |
| 315 | ((a) & 0xff) << 8 | \ | 315 | ((a) & 0xff) << 8 | \ |
| 316 | ((b) & 0xff)) | 316 | ((b) & 0xff)) |
| 317 | #define GETSA1(a) ((a >> 8) & 0xff) | ||
| 318 | #define GETSA2(a) (a & 0xff) | ||
| 319 | #define GETSA3(a) ((a >> 24) & 0xff) | ||
| 320 | #define GETSA4(a) ((a >> 16) & 0xff) | ||
| 317 | 321 | ||
| 318 | #define SA_CNTL MAKESA('C', 'N', 'T', 'L') | 322 | #define SA_CNTL MAKESA('C', 'N', 'T', 'L') |
| 319 | #define SA_DIAG MAKESA('D', 'I', 'A', 'G') | 323 | #define SA_DIAG MAKESA('D', 'I', 'A', 'G') |
| @@ -728,11 +732,12 @@ bad2: | |||
| 728 | uea_err(INS_TO_USBDEV(sc), "sending DSP block %u failed\n", i); | 732 | uea_err(INS_TO_USBDEV(sc), "sending DSP block %u failed\n", i); |
| 729 | return; | 733 | return; |
| 730 | bad1: | 734 | bad1: |
| 731 | uea_err(INS_TO_USBDEV(sc), "invalid DSP page %u requested\n",pageno); | 735 | uea_err(INS_TO_USBDEV(sc), "invalid DSP page %u requested\n", pageno); |
| 732 | } | 736 | } |
| 733 | 737 | ||
| 734 | static inline void wake_up_cmv_ack(struct uea_softc *sc) | 738 | static inline void wake_up_cmv_ack(struct uea_softc *sc) |
| 735 | { | 739 | { |
| 740 | BUG_ON(sc->cmv_ack); | ||
| 736 | sc->cmv_ack = 1; | 741 | sc->cmv_ack = 1; |
| 737 | wake_up(&sc->cmv_ack_wait); | 742 | wake_up(&sc->cmv_ack_wait); |
| 738 | } | 743 | } |
| @@ -743,6 +748,9 @@ static inline int wait_cmv_ack(struct uea_softc *sc) | |||
| 743 | sc->cmv_ack, ACK_TIMEOUT); | 748 | sc->cmv_ack, ACK_TIMEOUT); |
| 744 | sc->cmv_ack = 0; | 749 | sc->cmv_ack = 0; |
| 745 | 750 | ||
| 751 | uea_dbg(INS_TO_USBDEV(sc), "wait_event_timeout : %d ms\n", | ||
| 752 | jiffies_to_msecs(ret)); | ||
| 753 | |||
| 746 | if (ret < 0) | 754 | if (ret < 0) |
| 747 | return ret; | 755 | return ret; |
| 748 | 756 | ||
| @@ -791,6 +799,12 @@ static int uea_cmv(struct uea_softc *sc, | |||
| 791 | struct cmv cmv; | 799 | struct cmv cmv; |
| 792 | int ret; | 800 | int ret; |
| 793 | 801 | ||
| 802 | uea_enters(INS_TO_USBDEV(sc)); | ||
| 803 | uea_vdbg(INS_TO_USBDEV(sc), "Function : %d-%d, Address : %c%c%c%c, " | ||
| 804 | "offset : 0x%04x, data : 0x%08x\n", | ||
| 805 | FUNCTION_TYPE(function), FUNCTION_SUBTYPE(function), | ||
| 806 | GETSA1(address), GETSA2(address), GETSA3(address), | ||
| 807 | GETSA4(address), offset, data); | ||
| 794 | /* we send a request, but we expect a reply */ | 808 | /* we send a request, but we expect a reply */ |
| 795 | sc->cmv_function = function | 0x2; | 809 | sc->cmv_function = function | 0x2; |
| 796 | sc->cmv_idx++; | 810 | sc->cmv_idx++; |
| @@ -808,7 +822,9 @@ static int uea_cmv(struct uea_softc *sc, | |||
| 808 | ret = uea_request(sc, UEA_SET_BLOCK, UEA_MPTX_START, CMV_SIZE, &cmv); | 822 | ret = uea_request(sc, UEA_SET_BLOCK, UEA_MPTX_START, CMV_SIZE, &cmv); |
| 809 | if (ret < 0) | 823 | if (ret < 0) |
| 810 | return ret; | 824 | return ret; |
| 811 | return wait_cmv_ack(sc); | 825 | ret = wait_cmv_ack(sc); |
| 826 | uea_leaves(INS_TO_USBDEV(sc)); | ||
| 827 | return ret; | ||
| 812 | } | 828 | } |
| 813 | 829 | ||
| 814 | static inline int uea_read_cmv(struct uea_softc *sc, | 830 | static inline int uea_read_cmv(struct uea_softc *sc, |
| @@ -922,7 +938,7 @@ static int uea_stat(struct uea_softc *sc) | |||
| 922 | * we check the status again in order to detect the failure earlier | 938 | * we check the status again in order to detect the failure earlier |
| 923 | */ | 939 | */ |
| 924 | if (sc->stats.phy.flags) { | 940 | if (sc->stats.phy.flags) { |
| 925 | uea_dbg(INS_TO_USBDEV(sc), "Stat flag = %d\n", | 941 | uea_dbg(INS_TO_USBDEV(sc), "Stat flag = 0x%x\n", |
| 926 | sc->stats.phy.flags); | 942 | sc->stats.phy.flags); |
| 927 | return 0; | 943 | return 0; |
| 928 | } | 944 | } |
| @@ -1063,7 +1079,13 @@ static int uea_start_reset(struct uea_softc *sc) | |||
| 1063 | uea_enters(INS_TO_USBDEV(sc)); | 1079 | uea_enters(INS_TO_USBDEV(sc)); |
| 1064 | uea_info(INS_TO_USBDEV(sc), "(re)booting started\n"); | 1080 | uea_info(INS_TO_USBDEV(sc), "(re)booting started\n"); |
| 1065 | 1081 | ||
| 1082 | /* mask interrupt */ | ||
| 1066 | sc->booting = 1; | 1083 | sc->booting = 1; |
| 1084 | /* We need to set this here because, a ack timeout could have occured, | ||
| 1085 | * but before we start the reboot, the ack occurs and set this to 1. | ||
| 1086 | * So we will failed to wait Ready CMV. | ||
| 1087 | */ | ||
| 1088 | sc->cmv_ack = 0; | ||
| 1067 | UPDATE_ATM_STAT(signal, ATM_PHY_SIG_LOST); | 1089 | UPDATE_ATM_STAT(signal, ATM_PHY_SIG_LOST); |
| 1068 | 1090 | ||
| 1069 | /* reset statistics */ | 1091 | /* reset statistics */ |
| @@ -1089,6 +1111,7 @@ static int uea_start_reset(struct uea_softc *sc) | |||
| 1089 | 1111 | ||
| 1090 | msleep(1000); | 1112 | msleep(1000); |
| 1091 | sc->cmv_function = MAKEFUNCTION(ADSLDIRECTIVE, MODEMREADY); | 1113 | sc->cmv_function = MAKEFUNCTION(ADSLDIRECTIVE, MODEMREADY); |
| 1114 | /* demask interrupt */ | ||
| 1092 | sc->booting = 0; | 1115 | sc->booting = 0; |
| 1093 | 1116 | ||
| 1094 | /* start loading DSP */ | 1117 | /* start loading DSP */ |
| @@ -1101,6 +1124,8 @@ static int uea_start_reset(struct uea_softc *sc) | |||
| 1101 | if (ret < 0) | 1124 | if (ret < 0) |
| 1102 | return ret; | 1125 | return ret; |
| 1103 | 1126 | ||
| 1127 | uea_vdbg(INS_TO_USBDEV(sc), "Ready CMV received\n"); | ||
| 1128 | |||
| 1104 | /* Enter in R-IDLE (cmv) until instructed otherwise */ | 1129 | /* Enter in R-IDLE (cmv) until instructed otherwise */ |
| 1105 | ret = uea_write_cmv(sc, SA_CNTL, 0, 1); | 1130 | ret = uea_write_cmv(sc, SA_CNTL, 0, 1); |
| 1106 | if (ret < 0) | 1131 | if (ret < 0) |
| @@ -1121,6 +1146,7 @@ static int uea_start_reset(struct uea_softc *sc) | |||
| 1121 | } | 1146 | } |
| 1122 | /* Enter in R-ACT-REQ */ | 1147 | /* Enter in R-ACT-REQ */ |
| 1123 | ret = uea_write_cmv(sc, SA_CNTL, 0, 2); | 1148 | ret = uea_write_cmv(sc, SA_CNTL, 0, 2); |
| 1149 | uea_vdbg(INS_TO_USBDEV(sc), "Entering in R-ACT-REQ state\n"); | ||
| 1124 | out: | 1150 | out: |
| 1125 | release_firmware(cmvs_fw); | 1151 | release_firmware(cmvs_fw); |
| 1126 | sc->reset = 0; | 1152 | sc->reset = 0; |
| @@ -1235,6 +1261,7 @@ static void uea_dispatch_cmv(struct uea_softc *sc, struct cmv* cmv) | |||
| 1235 | 1261 | ||
| 1236 | if (cmv->bFunction == MAKEFUNCTION(ADSLDIRECTIVE, MODEMREADY)) { | 1262 | if (cmv->bFunction == MAKEFUNCTION(ADSLDIRECTIVE, MODEMREADY)) { |
| 1237 | wake_up_cmv_ack(sc); | 1263 | wake_up_cmv_ack(sc); |
| 1264 | uea_leaves(INS_TO_USBDEV(sc)); | ||
| 1238 | return; | 1265 | return; |
| 1239 | } | 1266 | } |
| 1240 | 1267 | ||
| @@ -1249,6 +1276,7 @@ static void uea_dispatch_cmv(struct uea_softc *sc, struct cmv* cmv) | |||
| 1249 | sc->data = sc->data << 16 | sc->data >> 16; | 1276 | sc->data = sc->data << 16 | sc->data >> 16; |
| 1250 | 1277 | ||
| 1251 | wake_up_cmv_ack(sc); | 1278 | wake_up_cmv_ack(sc); |
| 1279 | uea_leaves(INS_TO_USBDEV(sc)); | ||
| 1252 | return; | 1280 | return; |
| 1253 | 1281 | ||
| 1254 | bad2: | 1282 | bad2: |
| @@ -1256,12 +1284,14 @@ bad2: | |||
| 1256 | "Function : %d, Subfunction : %d\n", | 1284 | "Function : %d, Subfunction : %d\n", |
| 1257 | FUNCTION_TYPE(cmv->bFunction), | 1285 | FUNCTION_TYPE(cmv->bFunction), |
| 1258 | FUNCTION_SUBTYPE(cmv->bFunction)); | 1286 | FUNCTION_SUBTYPE(cmv->bFunction)); |
| 1287 | uea_leaves(INS_TO_USBDEV(sc)); | ||
| 1259 | return; | 1288 | return; |
| 1260 | 1289 | ||
| 1261 | bad1: | 1290 | bad1: |
| 1262 | uea_err(INS_TO_USBDEV(sc), "invalid cmv received, " | 1291 | uea_err(INS_TO_USBDEV(sc), "invalid cmv received, " |
| 1263 | "wPreamble %d, bDirection %d\n", | 1292 | "wPreamble %d, bDirection %d\n", |
| 1264 | le16_to_cpu(cmv->wPreamble), cmv->bDirection); | 1293 | le16_to_cpu(cmv->wPreamble), cmv->bDirection); |
| 1294 | uea_leaves(INS_TO_USBDEV(sc)); | ||
| 1265 | } | 1295 | } |
| 1266 | 1296 | ||
| 1267 | /* | 1297 | /* |
| @@ -1346,7 +1376,7 @@ static int uea_boot(struct uea_softc *sc) | |||
| 1346 | if (ret < 0) { | 1376 | if (ret < 0) { |
| 1347 | uea_err(INS_TO_USBDEV(sc), | 1377 | uea_err(INS_TO_USBDEV(sc), |
| 1348 | "urb submition failed with error %d\n", ret); | 1378 | "urb submition failed with error %d\n", ret); |
| 1349 | goto err1; | 1379 | goto err; |
| 1350 | } | 1380 | } |
| 1351 | 1381 | ||
| 1352 | sc->kthread = kthread_run(uea_kthread, sc, "ueagle-atm"); | 1382 | sc->kthread = kthread_run(uea_kthread, sc, "ueagle-atm"); |
| @@ -1360,10 +1390,10 @@ static int uea_boot(struct uea_softc *sc) | |||
| 1360 | 1390 | ||
| 1361 | err2: | 1391 | err2: |
| 1362 | usb_kill_urb(sc->urb_int); | 1392 | usb_kill_urb(sc->urb_int); |
| 1363 | err1: | ||
| 1364 | kfree(intr); | ||
| 1365 | err: | 1393 | err: |
| 1366 | usb_free_urb(sc->urb_int); | 1394 | usb_free_urb(sc->urb_int); |
| 1395 | sc->urb_int = NULL; | ||
| 1396 | kfree(intr); | ||
| 1367 | uea_leaves(INS_TO_USBDEV(sc)); | 1397 | uea_leaves(INS_TO_USBDEV(sc)); |
| 1368 | return -ENOMEM; | 1398 | return -ENOMEM; |
| 1369 | } | 1399 | } |
| @@ -1508,7 +1538,7 @@ static ssize_t read_##name(struct device *dev, \ | |||
| 1508 | int ret = -ENODEV; \ | 1538 | int ret = -ENODEV; \ |
| 1509 | struct uea_softc *sc; \ | 1539 | struct uea_softc *sc; \ |
| 1510 | \ | 1540 | \ |
| 1511 | mutex_lock(&uea_mutex); \ | 1541 | mutex_lock(&uea_mutex); \ |
| 1512 | sc = dev_to_uea(dev); \ | 1542 | sc = dev_to_uea(dev); \ |
| 1513 | if (!sc) \ | 1543 | if (!sc) \ |
| 1514 | goto out; \ | 1544 | goto out; \ |
| @@ -1516,7 +1546,7 @@ static ssize_t read_##name(struct device *dev, \ | |||
| 1516 | if (reset) \ | 1546 | if (reset) \ |
| 1517 | sc->stats.phy.name = 0; \ | 1547 | sc->stats.phy.name = 0; \ |
| 1518 | out: \ | 1548 | out: \ |
| 1519 | mutex_unlock(&uea_mutex); \ | 1549 | mutex_unlock(&uea_mutex); \ |
| 1520 | return ret; \ | 1550 | return ret; \ |
| 1521 | } \ | 1551 | } \ |
| 1522 | \ | 1552 | \ |
| @@ -1643,7 +1673,7 @@ static int uea_bind(struct usbatm_data *usbatm, struct usb_interface *intf, | |||
| 1643 | 1673 | ||
| 1644 | sc = kzalloc(sizeof(struct uea_softc), GFP_KERNEL); | 1674 | sc = kzalloc(sizeof(struct uea_softc), GFP_KERNEL); |
| 1645 | if (!sc) { | 1675 | if (!sc) { |
| 1646 | uea_err(INS_TO_USBDEV(sc), "uea_init: not enough memory !\n"); | 1676 | uea_err(usb, "uea_init: not enough memory !\n"); |
| 1647 | return -ENOMEM; | 1677 | return -ENOMEM; |
| 1648 | } | 1678 | } |
| 1649 | 1679 | ||
