diff options
Diffstat (limited to 'drivers/misc')
| -rw-r--r-- | drivers/misc/iwmc3200top/fw-download.c | 50 | ||||
| -rw-r--r-- | drivers/misc/iwmc3200top/iwmc3200top.h | 4 | ||||
| -rw-r--r-- | drivers/misc/iwmc3200top/log.h | 31 | ||||
| -rw-r--r-- | drivers/misc/iwmc3200top/main.c | 59 |
4 files changed, 73 insertions, 71 deletions
diff --git a/drivers/misc/iwmc3200top/fw-download.c b/drivers/misc/iwmc3200top/fw-download.c index 50d431e469f5..9dbaeb574e63 100644 --- a/drivers/misc/iwmc3200top/fw-download.c +++ b/drivers/misc/iwmc3200top/fw-download.c | |||
| @@ -43,15 +43,14 @@ static int iwmct_fw_parser_init(struct iwmct_priv *priv, const u8 *file, | |||
| 43 | struct iwmct_parser *parser = &priv->parser; | 43 | struct iwmct_parser *parser = &priv->parser; |
| 44 | struct iwmct_fw_hdr *fw_hdr = &parser->versions; | 44 | struct iwmct_fw_hdr *fw_hdr = &parser->versions; |
| 45 | 45 | ||
| 46 | LOG_INFOEX(priv, INIT, "-->\n"); | 46 | LOG_TRACE(priv, FW_DOWNLOAD, "-->\n"); |
| 47 | 47 | ||
| 48 | LOG_INFO(priv, FW_DOWNLOAD, "file_size=%zd\n", file_size); | 48 | LOG_INFO(priv, FW_DOWNLOAD, "file_size=%zd\n", file_size); |
| 49 | 49 | ||
| 50 | parser->file = file; | 50 | parser->file = file; |
| 51 | parser->file_size = file_size; | 51 | parser->file_size = file_size; |
| 52 | parser->cur_pos = 0; | 52 | parser->cur_pos = 0; |
| 53 | parser->buf = NULL; | 53 | parser->entry_point = 0; |
| 54 | |||
| 55 | parser->buf = kzalloc(block_size, GFP_KERNEL); | 54 | parser->buf = kzalloc(block_size, GFP_KERNEL); |
| 56 | if (!parser->buf) { | 55 | if (!parser->buf) { |
| 57 | LOG_ERROR(priv, FW_DOWNLOAD, "kzalloc error\n"); | 56 | LOG_ERROR(priv, FW_DOWNLOAD, "kzalloc error\n"); |
| @@ -70,7 +69,7 @@ static int iwmct_fw_parser_init(struct iwmct_priv *priv, const u8 *file, | |||
| 70 | 69 | ||
| 71 | parser->cur_pos += sizeof(struct iwmct_fw_hdr); | 70 | parser->cur_pos += sizeof(struct iwmct_fw_hdr); |
| 72 | 71 | ||
| 73 | LOG_INFOEX(priv, INIT, "<--\n"); | 72 | LOG_TRACE(priv, FW_DOWNLOAD, "<--\n"); |
| 74 | return 0; | 73 | return 0; |
| 75 | } | 74 | } |
| 76 | 75 | ||
| @@ -113,7 +112,7 @@ static int iwmct_parse_next_section(struct iwmct_priv *priv, const u8 **p_sec, | |||
| 113 | struct iwmct_dbg *dbg = &priv->dbg; | 112 | struct iwmct_dbg *dbg = &priv->dbg; |
| 114 | struct iwmct_fw_sec_hdr *sec_hdr; | 113 | struct iwmct_fw_sec_hdr *sec_hdr; |
| 115 | 114 | ||
| 116 | LOG_INFOEX(priv, INIT, "-->\n"); | 115 | LOG_TRACE(priv, FW_DOWNLOAD, "-->\n"); |
| 117 | 116 | ||
| 118 | while (parser->cur_pos + sizeof(struct iwmct_fw_sec_hdr) | 117 | while (parser->cur_pos + sizeof(struct iwmct_fw_sec_hdr) |
| 119 | <= parser->file_size) { | 118 | <= parser->file_size) { |
| @@ -152,7 +151,7 @@ static int iwmct_parse_next_section(struct iwmct_priv *priv, const u8 **p_sec, | |||
| 152 | "finished with section cur_pos=%zd\n", parser->cur_pos); | 151 | "finished with section cur_pos=%zd\n", parser->cur_pos); |
| 153 | } | 152 | } |
| 154 | 153 | ||
| 155 | LOG_INFOEX(priv, INIT, "<--\n"); | 154 | LOG_TRACE(priv, INIT, "<--\n"); |
| 156 | return 0; | 155 | return 0; |
| 157 | } | 156 | } |
| 158 | 157 | ||
| @@ -167,7 +166,7 @@ static int iwmct_download_section(struct iwmct_priv *priv, const u8 *p_sec, | |||
| 167 | int ret = 0; | 166 | int ret = 0; |
| 168 | u32 cmd = 0; | 167 | u32 cmd = 0; |
| 169 | 168 | ||
| 170 | LOG_INFOEX(priv, INIT, "-->\n"); | 169 | LOG_TRACE(priv, FW_DOWNLOAD, "-->\n"); |
| 171 | LOG_INFO(priv, FW_DOWNLOAD, "Download address 0x%x size 0x%zx\n", | 170 | LOG_INFO(priv, FW_DOWNLOAD, "Download address 0x%x size 0x%zx\n", |
| 172 | addr, sec_size); | 171 | addr, sec_size); |
| 173 | 172 | ||
| @@ -229,7 +228,7 @@ static int iwmct_download_section(struct iwmct_priv *priv, const u8 *p_sec, | |||
| 229 | hdr->cmd = cpu_to_le32(cmd); | 228 | hdr->cmd = cpu_to_le32(cmd); |
| 230 | /* send it down */ | 229 | /* send it down */ |
| 231 | /* TODO: add more proper sending and error checking */ | 230 | /* TODO: add more proper sending and error checking */ |
| 232 | ret = iwmct_tx(priv, 0, parser->buf, trans_size); | 231 | ret = iwmct_tx(priv, parser->buf, trans_size); |
| 233 | if (ret != 0) { | 232 | if (ret != 0) { |
| 234 | LOG_INFO(priv, FW_DOWNLOAD, | 233 | LOG_INFO(priv, FW_DOWNLOAD, |
| 235 | "iwmct_tx returned %d\n", ret); | 234 | "iwmct_tx returned %d\n", ret); |
| @@ -251,7 +250,7 @@ static int iwmct_download_section(struct iwmct_priv *priv, const u8 *p_sec, | |||
| 251 | if (sent < sec_size) | 250 | if (sent < sec_size) |
| 252 | ret = -EINVAL; | 251 | ret = -EINVAL; |
| 253 | exit: | 252 | exit: |
| 254 | LOG_INFOEX(priv, INIT, "<--\n"); | 253 | LOG_TRACE(priv, FW_DOWNLOAD, "<--\n"); |
| 255 | return ret; | 254 | return ret; |
| 256 | } | 255 | } |
| 257 | 256 | ||
| @@ -262,7 +261,7 @@ static int iwmct_kick_fw(struct iwmct_priv *priv, bool jump) | |||
| 262 | int ret; | 261 | int ret; |
| 263 | u32 cmd; | 262 | u32 cmd; |
| 264 | 263 | ||
| 265 | LOG_INFOEX(priv, INIT, "-->\n"); | 264 | LOG_TRACE(priv, FW_DOWNLOAD, "-->\n"); |
| 266 | 265 | ||
| 267 | memset(parser->buf, 0, parser->buf_size); | 266 | memset(parser->buf, 0, parser->buf_size); |
| 268 | cmd = IWMC_CMD_SIGNATURE << CMD_HDR_SIGNATURE_POS; | 267 | cmd = IWMC_CMD_SIGNATURE << CMD_HDR_SIGNATURE_POS; |
| @@ -281,11 +280,11 @@ static int iwmct_kick_fw(struct iwmct_priv *priv, bool jump) | |||
| 281 | LOG_HEXDUMP(FW_DOWNLOAD, parser->buf, sizeof(*hdr)); | 280 | LOG_HEXDUMP(FW_DOWNLOAD, parser->buf, sizeof(*hdr)); |
| 282 | /* send it down */ | 281 | /* send it down */ |
| 283 | /* TODO: add more proper sending and error checking */ | 282 | /* TODO: add more proper sending and error checking */ |
| 284 | ret = iwmct_tx(priv, 0, parser->buf, IWMC_SDIO_BLK_SIZE); | 283 | ret = iwmct_tx(priv, parser->buf, IWMC_SDIO_BLK_SIZE); |
| 285 | if (ret) | 284 | if (ret) |
| 286 | LOG_INFO(priv, FW_DOWNLOAD, "iwmct_tx returned %d", ret); | 285 | LOG_INFO(priv, FW_DOWNLOAD, "iwmct_tx returned %d", ret); |
| 287 | 286 | ||
| 288 | LOG_INFOEX(priv, INIT, "<--\n"); | 287 | LOG_TRACE(priv, FW_DOWNLOAD, "<--\n"); |
| 289 | return 0; | 288 | return 0; |
| 290 | } | 289 | } |
| 291 | 290 | ||
| @@ -298,8 +297,16 @@ int iwmct_fw_load(struct iwmct_priv *priv) | |||
| 298 | __le32 addr; | 297 | __le32 addr; |
| 299 | int ret; | 298 | int ret; |
| 300 | 299 | ||
| 301 | /* clear parser struct */ | 300 | |
| 302 | memset(&priv->parser, 0, sizeof(struct iwmct_parser)); | 301 | LOG_INFO(priv, FW_DOWNLOAD, "barker download request 0x%x is:\n", |
| 302 | priv->barker); | ||
| 303 | LOG_INFO(priv, FW_DOWNLOAD, "******* Top FW %s requested ********\n", | ||
| 304 | (priv->barker & BARKER_DNLOAD_TOP_MSK) ? "was" : "not"); | ||
| 305 | LOG_INFO(priv, FW_DOWNLOAD, "******* GPS FW %s requested ********\n", | ||
| 306 | (priv->barker & BARKER_DNLOAD_GPS_MSK) ? "was" : "not"); | ||
| 307 | LOG_INFO(priv, FW_DOWNLOAD, "******* BT FW %s requested ********\n", | ||
| 308 | (priv->barker & BARKER_DNLOAD_BT_MSK) ? "was" : "not"); | ||
| 309 | |||
| 303 | 310 | ||
| 304 | /* get the firmware */ | 311 | /* get the firmware */ |
| 305 | ret = request_firmware(&raw, fw_name, &priv->func->dev); | 312 | ret = request_firmware(&raw, fw_name, &priv->func->dev); |
| @@ -317,6 +324,7 @@ int iwmct_fw_load(struct iwmct_priv *priv) | |||
| 317 | 324 | ||
| 318 | LOG_INFO(priv, FW_DOWNLOAD, "Read firmware '%s'\n", fw_name); | 325 | LOG_INFO(priv, FW_DOWNLOAD, "Read firmware '%s'\n", fw_name); |
| 319 | 326 | ||
| 327 | /* clear parser struct */ | ||
| 320 | ret = iwmct_fw_parser_init(priv, raw->data, raw->size, priv->trans_len); | 328 | ret = iwmct_fw_parser_init(priv, raw->data, raw->size, priv->trans_len); |
| 321 | if (ret < 0) { | 329 | if (ret < 0) { |
| 322 | LOG_ERROR(priv, FW_DOWNLOAD, | 330 | LOG_ERROR(priv, FW_DOWNLOAD, |
| @@ -324,7 +332,6 @@ int iwmct_fw_load(struct iwmct_priv *priv) | |||
| 324 | goto exit; | 332 | goto exit; |
| 325 | } | 333 | } |
| 326 | 334 | ||
| 327 | /* checksum */ | ||
| 328 | if (!iwmct_checksum(priv)) { | 335 | if (!iwmct_checksum(priv)) { |
| 329 | LOG_ERROR(priv, FW_DOWNLOAD, "checksum error\n"); | 336 | LOG_ERROR(priv, FW_DOWNLOAD, "checksum error\n"); |
| 330 | ret = -EINVAL; | 337 | ret = -EINVAL; |
| @@ -333,23 +340,18 @@ int iwmct_fw_load(struct iwmct_priv *priv) | |||
| 333 | 340 | ||
| 334 | /* download firmware to device */ | 341 | /* download firmware to device */ |
| 335 | while (iwmct_parse_next_section(priv, &pdata, &len, &addr)) { | 342 | while (iwmct_parse_next_section(priv, &pdata, &len, &addr)) { |
| 336 | if (iwmct_download_section(priv, pdata, len, addr)) { | 343 | ret = iwmct_download_section(priv, pdata, len, addr); |
| 344 | if (ret) { | ||
| 337 | LOG_ERROR(priv, FW_DOWNLOAD, | 345 | LOG_ERROR(priv, FW_DOWNLOAD, |
| 338 | "%s download section failed\n", fw_name); | 346 | "%s download section failed\n", fw_name); |
| 339 | ret = -EIO; | ||
| 340 | goto exit; | 347 | goto exit; |
| 341 | } | 348 | } |
| 342 | } | 349 | } |
| 343 | 350 | ||
| 344 | iwmct_kick_fw(priv, !!(priv->barker & BARKER_DNLOAD_JUMP_MSK)); | 351 | ret = iwmct_kick_fw(priv, !!(priv->barker & BARKER_DNLOAD_JUMP_MSK)); |
| 345 | 352 | ||
| 346 | exit: | 353 | exit: |
| 347 | kfree(priv->parser.buf); | 354 | kfree(priv->parser.buf); |
| 348 | 355 | release_firmware(raw); | |
| 349 | if (raw) | ||
| 350 | release_firmware(raw); | ||
| 351 | |||
| 352 | raw = NULL; | ||
| 353 | |||
| 354 | return ret; | 356 | return ret; |
| 355 | } | 357 | } |
diff --git a/drivers/misc/iwmc3200top/iwmc3200top.h b/drivers/misc/iwmc3200top/iwmc3200top.h index 43bd510e1872..740ff0738ea8 100644 --- a/drivers/misc/iwmc3200top/iwmc3200top.h +++ b/drivers/misc/iwmc3200top/iwmc3200top.h | |||
| @@ -196,9 +196,7 @@ struct iwmct_priv { | |||
| 196 | struct list_head read_req_list; | 196 | struct list_head read_req_list; |
| 197 | }; | 197 | }; |
| 198 | 198 | ||
| 199 | extern int iwmct_tx(struct iwmct_priv *priv, unsigned int addr, | 199 | extern int iwmct_tx(struct iwmct_priv *priv, void *src, int count); |
| 200 | void *src, int count); | ||
| 201 | |||
| 202 | extern int iwmct_fw_load(struct iwmct_priv *priv); | 200 | extern int iwmct_fw_load(struct iwmct_priv *priv); |
| 203 | 201 | ||
| 204 | extern void iwmct_dbg_init_params(struct iwmct_priv *drv); | 202 | extern void iwmct_dbg_init_params(struct iwmct_priv *drv); |
diff --git a/drivers/misc/iwmc3200top/log.h b/drivers/misc/iwmc3200top/log.h index aba8121f978c..4434bb16cea7 100644 --- a/drivers/misc/iwmc3200top/log.h +++ b/drivers/misc/iwmc3200top/log.h | |||
| @@ -37,13 +37,26 @@ | |||
| 37 | #define LOG_SEV_INFO 3 | 37 | #define LOG_SEV_INFO 3 |
| 38 | #define LOG_SEV_INFOEX 4 | 38 | #define LOG_SEV_INFOEX 4 |
| 39 | 39 | ||
| 40 | #define LOG_SEV_FILTER_ALL \ | 40 | /* Log levels not defined for FW */ |
| 41 | (BIT(LOG_SEV_CRITICAL) | \ | 41 | #define LOG_SEV_TRACE 5 |
| 42 | BIT(LOG_SEV_ERROR) | \ | 42 | #define LOG_SEV_DUMP 6 |
| 43 | BIT(LOG_SEV_WARNING) | \ | 43 | |
| 44 | BIT(LOG_SEV_INFO) | \ | 44 | #define LOG_SEV_FW_FILTER_ALL \ |
| 45 | (BIT(LOG_SEV_CRITICAL) | \ | ||
| 46 | BIT(LOG_SEV_ERROR) | \ | ||
| 47 | BIT(LOG_SEV_WARNING) | \ | ||
| 48 | BIT(LOG_SEV_INFO) | \ | ||
| 45 | BIT(LOG_SEV_INFOEX)) | 49 | BIT(LOG_SEV_INFOEX)) |
| 46 | 50 | ||
| 51 | #define LOG_SEV_FILTER_ALL \ | ||
| 52 | (BIT(LOG_SEV_CRITICAL) | \ | ||
| 53 | BIT(LOG_SEV_ERROR) | \ | ||
| 54 | BIT(LOG_SEV_WARNING) | \ | ||
| 55 | BIT(LOG_SEV_INFO) | \ | ||
| 56 | BIT(LOG_SEV_INFOEX) | \ | ||
| 57 | BIT(LOG_SEV_TRACE) | \ | ||
| 58 | BIT(LOG_SEV_DUMP)) | ||
| 59 | |||
| 47 | /* log source */ | 60 | /* log source */ |
| 48 | #define LOG_SRC_INIT 0 | 61 | #define LOG_SRC_INIT 0 |
| 49 | #define LOG_SRC_DEBUGFS 1 | 62 | #define LOG_SRC_DEBUGFS 1 |
| @@ -104,16 +117,16 @@ do { \ | |||
| 104 | __func__, __LINE__, ##args); \ | 117 | __func__, __LINE__, ##args); \ |
| 105 | } while (0) | 118 | } while (0) |
| 106 | 119 | ||
| 107 | #define LOG_INFOEX(priv, src, fmt, args...) \ | 120 | #define LOG_TRACE(priv, src, fmt, args...) \ |
| 108 | do { \ | 121 | do { \ |
| 109 | if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_INFOEX)) \ | 122 | if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_TRACE)) \ |
| 110 | dev_dbg(priv2dev(priv), "%s %d: " fmt, \ | 123 | dev_dbg(priv2dev(priv), "%s %d: " fmt, \ |
| 111 | __func__, __LINE__, ##args); \ | 124 | __func__, __LINE__, ##args); \ |
| 112 | } while (0) | 125 | } while (0) |
| 113 | 126 | ||
| 114 | #define LOG_HEXDUMP(src, ptr, len) \ | 127 | #define LOG_HEXDUMP(src, ptr, len) \ |
| 115 | do { \ | 128 | do { \ |
| 116 | if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_INFOEX)) \ | 129 | if (iwmct_logdefs[LOG_SRC_ ## src] & BIT(LOG_SEV_DUMP)) \ |
| 117 | print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_NONE, \ | 130 | print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_NONE, \ |
| 118 | 16, 1, ptr, len, false); \ | 131 | 16, 1, ptr, len, false); \ |
| 119 | } while (0) | 132 | } while (0) |
| @@ -142,7 +155,7 @@ ssize_t store_iwmct_log_level_fw(struct device *d, | |||
| 142 | #define LOG_ERROR(priv, src, fmt, args...) | 155 | #define LOG_ERROR(priv, src, fmt, args...) |
| 143 | #define LOG_WARNING(priv, src, fmt, args...) | 156 | #define LOG_WARNING(priv, src, fmt, args...) |
| 144 | #define LOG_INFO(priv, src, fmt, args...) | 157 | #define LOG_INFO(priv, src, fmt, args...) |
| 145 | #define LOG_INFOEX(priv, src, fmt, args...) | 158 | #define LOG_TRACE(priv, src, fmt, args...) |
| 146 | #define LOG_HEXDUMP(src, ptr, len) | 159 | #define LOG_HEXDUMP(src, ptr, len) |
| 147 | 160 | ||
| 148 | static inline void iwmct_log_top_message(struct iwmct_priv *priv, | 161 | static inline void iwmct_log_top_message(struct iwmct_priv *priv, |
diff --git a/drivers/misc/iwmc3200top/main.c b/drivers/misc/iwmc3200top/main.c index fafcaa481d74..dd0a3913bf6d 100644 --- a/drivers/misc/iwmc3200top/main.c +++ b/drivers/misc/iwmc3200top/main.c | |||
| @@ -49,6 +49,20 @@ MODULE_LICENSE("GPL"); | |||
| 49 | MODULE_AUTHOR(DRIVER_COPYRIGHT); | 49 | MODULE_AUTHOR(DRIVER_COPYRIGHT); |
| 50 | MODULE_FIRMWARE(FW_NAME(FW_API_VER)); | 50 | MODULE_FIRMWARE(FW_NAME(FW_API_VER)); |
| 51 | 51 | ||
| 52 | |||
| 53 | static inline int __iwmct_tx(struct iwmct_priv *priv, void *src, int count) | ||
| 54 | { | ||
| 55 | return sdio_memcpy_toio(priv->func, IWMC_SDIO_DATA_ADDR, src, count); | ||
| 56 | |||
| 57 | } | ||
| 58 | int iwmct_tx(struct iwmct_priv *priv, void *src, int count) | ||
| 59 | { | ||
| 60 | int ret; | ||
| 61 | sdio_claim_host(priv->func); | ||
| 62 | ret = __iwmct_tx(priv, src, count); | ||
| 63 | sdio_release_host(priv->func); | ||
| 64 | return ret; | ||
| 65 | } | ||
| 52 | /* | 66 | /* |
| 53 | * This workers main task is to wait for OP_OPR_ALIVE | 67 | * This workers main task is to wait for OP_OPR_ALIVE |
| 54 | * from TOP FW until ALIVE_MSG_TIMOUT timeout is elapsed. | 68 | * from TOP FW until ALIVE_MSG_TIMOUT timeout is elapsed. |
| @@ -66,7 +80,7 @@ static void iwmct_rescan_worker(struct work_struct *ws) | |||
| 66 | 80 | ||
| 67 | ret = bus_rescan_devices(priv->func->dev.bus); | 81 | ret = bus_rescan_devices(priv->func->dev.bus); |
| 68 | if (ret < 0) | 82 | if (ret < 0) |
| 69 | LOG_INFO(priv, FW_DOWNLOAD, "bus_rescan_devices FAILED!!!\n"); | 83 | LOG_INFO(priv, INIT, "bus_rescan_devices FAILED!!!\n"); |
| 70 | } | 84 | } |
| 71 | 85 | ||
| 72 | static void op_top_message(struct iwmct_priv *priv, struct top_msg *msg) | 86 | static void op_top_message(struct iwmct_priv *priv, struct top_msg *msg) |
| @@ -137,7 +151,7 @@ int iwmct_send_hcmd(struct iwmct_priv *priv, u8 *cmd, u16 len) | |||
| 137 | int ret; | 151 | int ret; |
| 138 | u8 *buf; | 152 | u8 *buf; |
| 139 | 153 | ||
| 140 | LOG_INFOEX(priv, FW_MSG, "Sending hcmd:\n"); | 154 | LOG_TRACE(priv, FW_MSG, "Sending hcmd:\n"); |
| 141 | 155 | ||
| 142 | /* add padding to 256 for IWMC */ | 156 | /* add padding to 256 for IWMC */ |
| 143 | ((struct top_msg *)cmd)->hdr.flags |= CMD_FLAG_PADDING_256; | 157 | ((struct top_msg *)cmd)->hdr.flags |= CMD_FLAG_PADDING_256; |
| @@ -158,27 +172,12 @@ int iwmct_send_hcmd(struct iwmct_priv *priv, u8 *cmd, u16 len) | |||
| 158 | } | 172 | } |
| 159 | 173 | ||
| 160 | memcpy(buf, cmd, len); | 174 | memcpy(buf, cmd, len); |
| 161 | 175 | ret = iwmct_tx(priv, buf, FW_HCMD_BLOCK_SIZE); | |
| 162 | sdio_claim_host(priv->func); | ||
| 163 | ret = sdio_memcpy_toio(priv->func, IWMC_SDIO_DATA_ADDR, buf, | ||
| 164 | FW_HCMD_BLOCK_SIZE); | ||
| 165 | sdio_release_host(priv->func); | ||
| 166 | 176 | ||
| 167 | kfree(buf); | 177 | kfree(buf); |
| 168 | return ret; | 178 | return ret; |
| 169 | } | 179 | } |
| 170 | 180 | ||
| 171 | int iwmct_tx(struct iwmct_priv *priv, unsigned int addr, | ||
| 172 | void *src, int count) | ||
| 173 | { | ||
| 174 | int ret; | ||
| 175 | |||
| 176 | sdio_claim_host(priv->func); | ||
| 177 | ret = sdio_memcpy_toio(priv->func, addr, src, count); | ||
| 178 | sdio_release_host(priv->func); | ||
| 179 | |||
| 180 | return ret; | ||
| 181 | } | ||
| 182 | 181 | ||
| 183 | static void iwmct_irq_read_worker(struct work_struct *ws) | 182 | static void iwmct_irq_read_worker(struct work_struct *ws) |
| 184 | { | 183 | { |
| @@ -192,7 +191,7 @@ static void iwmct_irq_read_worker(struct work_struct *ws) | |||
| 192 | 191 | ||
| 193 | priv = container_of(ws, struct iwmct_priv, isr_worker); | 192 | priv = container_of(ws, struct iwmct_priv, isr_worker); |
| 194 | 193 | ||
| 195 | LOG_INFO(priv, IRQ, "enter iwmct_irq_read_worker %p\n", ws); | 194 | LOG_TRACE(priv, IRQ, "enter iwmct_irq_read_worker %p\n", ws); |
| 196 | 195 | ||
| 197 | /* --------------------- Handshake with device -------------------- */ | 196 | /* --------------------- Handshake with device -------------------- */ |
| 198 | sdio_claim_host(priv->func); | 197 | sdio_claim_host(priv->func); |
| @@ -273,8 +272,7 @@ static void iwmct_irq_read_worker(struct work_struct *ws) | |||
| 273 | 272 | ||
| 274 | if (barker & BARKER_DNLOAD_SYNC_MSK) { | 273 | if (barker & BARKER_DNLOAD_SYNC_MSK) { |
| 275 | /* Send the same barker back */ | 274 | /* Send the same barker back */ |
| 276 | ret = sdio_memcpy_toio(priv->func, IWMC_SDIO_DATA_ADDR, | 275 | ret = __iwmct_tx(priv, buf, iosize); |
| 277 | buf, iosize); | ||
| 278 | if (ret) { | 276 | if (ret) { |
| 279 | LOG_ERROR(priv, IRQ, | 277 | LOG_ERROR(priv, IRQ, |
| 280 | "error %d echoing barker\n", ret); | 278 | "error %d echoing barker\n", ret); |
| @@ -292,15 +290,6 @@ static void iwmct_irq_read_worker(struct work_struct *ws) | |||
| 292 | 290 | ||
| 293 | sdio_release_host(priv->func); | 291 | sdio_release_host(priv->func); |
| 294 | 292 | ||
| 295 | |||
| 296 | LOG_INFO(priv, IRQ, "barker download request 0x%x is:\n", priv->barker); | ||
| 297 | LOG_INFO(priv, IRQ, "******* Top FW %s requested ********\n", | ||
| 298 | (priv->barker & BARKER_DNLOAD_TOP_MSK) ? "was" : "not"); | ||
| 299 | LOG_INFO(priv, IRQ, "******* GPS FW %s requested ********\n", | ||
| 300 | (priv->barker & BARKER_DNLOAD_GPS_MSK) ? "was" : "not"); | ||
| 301 | LOG_INFO(priv, IRQ, "******* BT FW %s requested ********\n", | ||
| 302 | (priv->barker & BARKER_DNLOAD_BT_MSK) ? "was" : "not"); | ||
| 303 | |||
| 304 | if (priv->dbg.fw_download) | 293 | if (priv->dbg.fw_download) |
| 305 | iwmct_fw_load(priv); | 294 | iwmct_fw_load(priv); |
| 306 | else | 295 | else |
| @@ -312,7 +301,7 @@ exit_release: | |||
| 312 | sdio_release_host(priv->func); | 301 | sdio_release_host(priv->func); |
| 313 | exit: | 302 | exit: |
| 314 | kfree(buf); | 303 | kfree(buf); |
| 315 | LOG_INFO(priv, IRQ, "exit iwmct_irq_read_worker\n"); | 304 | LOG_TRACE(priv, IRQ, "exit iwmct_irq_read_worker\n"); |
| 316 | } | 305 | } |
| 317 | 306 | ||
| 318 | static void iwmct_irq(struct sdio_func *func) | 307 | static void iwmct_irq(struct sdio_func *func) |
| @@ -325,12 +314,12 @@ static void iwmct_irq(struct sdio_func *func) | |||
| 325 | 314 | ||
| 326 | priv = sdio_get_drvdata(func); | 315 | priv = sdio_get_drvdata(func); |
| 327 | 316 | ||
| 328 | LOG_INFO(priv, IRQ, "enter iwmct_irq\n"); | 317 | LOG_TRACE(priv, IRQ, "enter iwmct_irq\n"); |
| 329 | 318 | ||
| 330 | /* read the function's status register */ | 319 | /* read the function's status register */ |
| 331 | val = sdio_readb(func, IWMC_SDIO_INTR_STATUS_ADDR, &ret); | 320 | val = sdio_readb(func, IWMC_SDIO_INTR_STATUS_ADDR, &ret); |
| 332 | 321 | ||
| 333 | LOG_INFO(priv, IRQ, "iir value = %d, ret=%d\n", val, ret); | 322 | LOG_TRACE(priv, IRQ, "iir value = %d, ret=%d\n", val, ret); |
| 334 | 323 | ||
| 335 | if (!val) { | 324 | if (!val) { |
| 336 | LOG_ERROR(priv, IRQ, "iir = 0, exiting ISR\n"); | 325 | LOG_ERROR(priv, IRQ, "iir = 0, exiting ISR\n"); |
| @@ -372,7 +361,7 @@ static void iwmct_irq(struct sdio_func *func) | |||
| 372 | 361 | ||
| 373 | queue_work(priv->wq, &priv->isr_worker); | 362 | queue_work(priv->wq, &priv->isr_worker); |
| 374 | 363 | ||
| 375 | LOG_INFO(priv, IRQ, "exit iwmct_irq\n"); | 364 | LOG_TRACE(priv, IRQ, "exit iwmct_irq\n"); |
| 376 | 365 | ||
| 377 | return; | 366 | return; |
| 378 | 367 | ||
| @@ -660,7 +649,7 @@ static int __init iwmct_init(void) | |||
| 660 | 649 | ||
| 661 | /* Default log filter settings */ | 650 | /* Default log filter settings */ |
| 662 | iwmct_log_set_filter(LOG_SRC_ALL, LOG_SEV_FILTER_RUNTIME); | 651 | iwmct_log_set_filter(LOG_SRC_ALL, LOG_SEV_FILTER_RUNTIME); |
| 663 | iwmct_log_set_filter(LOG_SRC_FW_MSG, LOG_SEV_FILTER_ALL); | 652 | iwmct_log_set_filter(LOG_SRC_FW_MSG, LOG_SEV_FW_FILTER_ALL); |
| 664 | iwmct_log_set_fw_filter(LOG_SRC_ALL, FW_LOG_SEV_FILTER_RUNTIME); | 653 | iwmct_log_set_fw_filter(LOG_SRC_ALL, FW_LOG_SEV_FILTER_RUNTIME); |
| 665 | 654 | ||
| 666 | rc = sdio_register_driver(&iwmct_driver); | 655 | rc = sdio_register_driver(&iwmct_driver); |
