1/* 2 * ISDB-S driver for VA1J5JF8007/VA1J5JF8011 3 * 4 * Copyright (C) 2009 HIRANO Takahito <hiranotaka@zng.info> 5 * 6 * based on pt1dvr - http://pt1dvr.sourceforge.jp/ 7 * by Tomoaki Ishikawa <tomy@users.sourceforge.jp> 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22 */ 23 24#include <linux/kernel.h> 25#include <linux/module.h> 26#include <linux/slab.h> 27#include <linux/i2c.h> 28#include "dvb_frontend.h" 29#include "va1j5jf8007s.h" 30 31enum va1j5jf8007s_tune_state { 32 VA1J5JF8007S_IDLE, 33 VA1J5JF8007S_SET_FREQUENCY_1, 34 VA1J5JF8007S_SET_FREQUENCY_2, 35 VA1J5JF8007S_SET_FREQUENCY_3, 36 VA1J5JF8007S_CHECK_FREQUENCY, 37 VA1J5JF8007S_SET_MODULATION, 38 VA1J5JF8007S_CHECK_MODULATION, 39 VA1J5JF8007S_SET_TS_ID, 40 VA1J5JF8007S_CHECK_TS_ID, 41 VA1J5JF8007S_TRACK, 42}; 43 44struct va1j5jf8007s_state { 45 const struct va1j5jf8007s_config *config; 46 struct i2c_adapter *adap; 47 struct dvb_frontend fe; 48 enum va1j5jf8007s_tune_state tune_state; 49}; 50 51static int va1j5jf8007s_read_snr(struct dvb_frontend *fe, u16 *snr) 52{ 53 struct va1j5jf8007s_state *state; 54 u8 addr; 55 int i; 56 u8 write_buf[1], read_buf[1]; 57 struct i2c_msg msgs[2]; 58 s32 word, x1, x2, x3, x4, x5, y; 59 60 state = fe->demodulator_priv; 61 addr = state->config->demod_address; 62 63 word = 0; 64 for (i = 0; i < 2; i++) { 65 write_buf[0] = 0xbc + i; 66 67 msgs[0].addr = addr; 68 msgs[0].flags = 0; 69 msgs[0].len = sizeof(write_buf); 70 msgs[0].buf = write_buf; 71 72 msgs[1].addr = addr; 73 msgs[1].flags = I2C_M_RD; 74 msgs[1].len = sizeof(read_buf); 75 msgs[1].buf = read_buf; 76 77 if (i2c_transfer(state->adap, msgs, 2) != 2) 78 return -EREMOTEIO; 79 80 word <<= 8; 81 word |= read_buf[0]; 82 } 83 84 word -= 3000; 85 if (word < 0) 86 word = 0; 87 88 x1 = int_sqrt(word << 16) * ((15625ll << 21) / 1000000); 89 x2 = (s64)x1 * x1 >> 31; 90 x3 = (s64)x2 * x1 >> 31; 91 x4 = (s64)x2 * x2 >> 31; 92 x5 = (s64)x4 * x1 >> 31; 93 94 y = (58857ll << 23) / 1000; 95 y -= (s64)x1 * ((89565ll << 24) / 1000) >> 30; 96 y += (s64)x2 * ((88977ll << 24) / 1000) >> 28; 97 y -= (s64)x3 * ((50259ll << 25) / 1000) >> 27; 98 y += (s64)x4 * ((14341ll << 27) / 1000) >> 27; 99 y -= (s64)x5 * ((16346ll << 30) / 10000) >> 28; 100 101 *snr = y < 0 ? 0 : y >> 15; 102 return 0; 103} 104 105static int va1j5jf8007s_get_frontend_algo(struct dvb_frontend *fe) 106{ 107 return DVBFE_ALGO_HW; 108} 109 110static int 111va1j5jf8007s_read_status(struct dvb_frontend *fe, fe_status_t *status) 112{ 113 struct va1j5jf8007s_state *state; 114 115 state = fe->demodulator_priv; 116 117 switch (state->tune_state) { 118 case VA1J5JF8007S_IDLE: 119 case VA1J5JF8007S_SET_FREQUENCY_1: 120 case VA1J5JF8007S_SET_FREQUENCY_2: 121 case VA1J5JF8007S_SET_FREQUENCY_3: 122 case VA1J5JF8007S_CHECK_FREQUENCY: 123 *status = 0; 124 return 0; 125 126 127 case VA1J5JF8007S_SET_MODULATION: 128 case VA1J5JF8007S_CHECK_MODULATION: 129 *status |= FE_HAS_SIGNAL; 130 return 0; 131 132 case VA1J5JF8007S_SET_TS_ID: 133 case VA1J5JF8007S_CHECK_TS_ID: 134 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER; 135 return 0; 136 137 case VA1J5JF8007S_TRACK: 138 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_LOCK; 139 return 0; 140 } 141 142 BUG(); 143} 144 145struct va1j5jf8007s_cb_map { 146 u32 frequency; 147 u8 cb; 148}; 149 150static const struct va1j5jf8007s_cb_map va1j5jf8007s_cb_maps[] = { 151 { 986000, 0xb2 }, 152 { 1072000, 0xd2 }, 153 { 1154000, 0xe2 }, 154 { 1291000, 0x20 }, 155 { 1447000, 0x40 }, 156 { 1615000, 0x60 }, 157 { 1791000, 0x80 }, 158 { 1972000, 0xa0 }, 159}; 160 161static u8 va1j5jf8007s_lookup_cb(u32 frequency) 162{ 163 int i; 164 const struct va1j5jf8007s_cb_map *map; 165 166 for (i = 0; i < ARRAY_SIZE(va1j5jf8007s_cb_maps); i++) { 167 map = &va1j5jf8007s_cb_maps[i]; 168 if (frequency < map->frequency) 169 return map->cb; 170 } 171 return 0xc0; 172} 173 174static int va1j5jf8007s_set_frequency_1(struct va1j5jf8007s_state *state) 175{ 176 u32 frequency; 177 u16 word; 178 u8 buf[6]; 179 struct i2c_msg msg; 180 181 frequency = state->fe.dtv_property_cache.frequency; 182 183 word = (frequency + 500) / 1000; 184 if (frequency < 1072000) 185 word = (word << 1 & ~0x1f) | (word & 0x0f); 186 187 buf[0] = 0xfe; 188 buf[1] = 0xc0; 189 buf[2] = 0x40 | word >> 8; 190 buf[3] = word; 191 buf[4] = 0xe0; 192 buf[5] = va1j5jf8007s_lookup_cb(frequency); 193 194 msg.addr = state->config->demod_address; 195 msg.flags = 0; 196 msg.len = sizeof(buf); 197 msg.buf = buf; 198 199 if (i2c_transfer(state->adap, &msg, 1) != 1) 200 return -EREMOTEIO; 201 202 return 0; 203} 204 205static int va1j5jf8007s_set_frequency_2(struct va1j5jf8007s_state *state) 206{ 207 u8 buf[3]; 208 struct i2c_msg msg; 209 210 buf[0] = 0xfe; 211 buf[1] = 0xc0; 212 buf[2] = 0xe4; 213 214 msg.addr = state->config->demod_address; 215 msg.flags = 0; 216 msg.len = sizeof(buf); 217 msg.buf = buf; 218 219 if (i2c_transfer(state->adap, &msg, 1) != 1) 220 return -EREMOTEIO; 221 222 return 0; 223} 224 225static int va1j5jf8007s_set_frequency_3(struct va1j5jf8007s_state *state) 226{ 227 u32 frequency; 228 u8 buf[4]; 229 struct i2c_msg msg; 230 231 frequency = state->fe.dtv_property_cache.frequency; 232 233 buf[0] = 0xfe; 234 buf[1] = 0xc0; 235 buf[2] = 0xf4; 236 buf[3] = va1j5jf8007s_lookup_cb(frequency) | 0x4; 237 238 msg.addr = state->config->demod_address; 239 msg.flags = 0; 240 msg.len = sizeof(buf); 241 msg.buf = buf; 242 243 if (i2c_transfer(state->adap, &msg, 1) != 1) 244 return -EREMOTEIO; 245 246 return 0; 247} 248 249static int 250va1j5jf8007s_check_frequency(struct va1j5jf8007s_state *state, int *lock) 251{ 252 u8 addr; 253 u8 write_buf[2], read_buf[1]; 254 struct i2c_msg msgs[2]; 255 256 addr = state->config->demod_address; 257 258 write_buf[0] = 0xfe; 259 write_buf[1] = 0xc1; 260 261 msgs[0].addr = addr; 262 msgs[0].flags = 0; 263 msgs[0].len = sizeof(write_buf); 264 msgs[0].buf = write_buf; 265 266 msgs[1].addr = addr; 267 msgs[1].flags = I2C_M_RD; 268 msgs[1].len = sizeof(read_buf); 269 msgs[1].buf = read_buf; 270 271 if (i2c_transfer(state->adap, msgs, 2) != 2) 272 return -EREMOTEIO; 273 274 *lock = read_buf[0] & 0x40; 275 return 0; 276} 277 278static int va1j5jf8007s_set_modulation(struct va1j5jf8007s_state *state) 279{ 280 u8 buf[2]; 281 struct i2c_msg msg; 282 283 buf[0] = 0x03; 284 buf[1] = 0x01; 285 286 msg.addr = state->config->demod_address; 287 msg.flags = 0; 288 msg.len = sizeof(buf); 289 msg.buf = buf; 290 291 if (i2c_transfer(state->adap, &msg, 1) != 1) 292 return -EREMOTEIO; 293 294 return 0; 295} 296 297static int 298va1j5jf8007s_check_modulation(struct va1j5jf8007s_state *state, int *lock) 299{ 300 u8 addr; 301 u8 write_buf[1], read_buf[1]; 302 struct i2c_msg msgs[2]; 303 304 addr = state->config->demod_address; 305 306 write_buf[0] = 0xc3; 307 308 msgs[0].addr = addr; 309 msgs[0].flags = 0; 310 msgs[0].len = sizeof(write_buf); 311 msgs[0].buf = write_buf; 312 313 msgs[1].addr = addr; 314 msgs[1].flags = I2C_M_RD; 315 msgs[1].len = sizeof(read_buf); 316 msgs[1].buf = read_buf; 317 318 if (i2c_transfer(state->adap, msgs, 2) != 2) 319 return -EREMOTEIO; 320 321 *lock = !(read_buf[0] & 0x10); 322 return 0; 323} 324 325static int 326va1j5jf8007s_set_ts_id(struct va1j5jf8007s_state *state) 327{ 328 u32 ts_id; 329 u8 buf[3]; 330 struct i2c_msg msg; 331 332 ts_id = state->fe.dtv_property_cache.isdbs_ts_id; 333 if (!ts_id) 334 return 0; 335 336 buf[0] = 0x8f; 337 buf[1] = ts_id >> 8; 338 buf[2] = ts_id; 339 340 msg.addr = state->config->demod_address; 341 msg.flags = 0; 342 msg.len = sizeof(buf); 343 msg.buf = buf; 344 345 if (i2c_transfer(state->adap, &msg, 1) != 1) 346 return -EREMOTEIO; 347 348 return 0; 349} 350 351static int 352va1j5jf8007s_check_ts_id(struct va1j5jf8007s_state *state, int *lock) 353{ 354 u8 addr; 355 u8 write_buf[1], read_buf[2]; 356 struct i2c_msg msgs[2]; 357 u32 ts_id; 358 359 ts_id = state->fe.dtv_property_cache.isdbs_ts_id; 360 if (!ts_id) { 361 *lock = 1; 362 return 0; 363 } 364 365 addr = state->config->demod_address; 366 367 write_buf[0] = 0xe6; 368 369 msgs[0].addr = addr; 370 msgs[0].flags = 0; 371 msgs[0].len = sizeof(write_buf); 372 msgs[0].buf = write_buf; 373 374 msgs[1].addr = addr; 375 msgs[1].flags = I2C_M_RD; 376 msgs[1].len = sizeof(read_buf); 377 msgs[1].buf = read_buf; 378 379 if (i2c_transfer(state->adap, msgs, 2) != 2) 380 return -EREMOTEIO; 381 382 *lock = (read_buf[0] << 8 | read_buf[1]) == ts_id; 383 return 0; 384} 385 386static int 387va1j5jf8007s_tune(struct dvb_frontend *fe, 388 bool re_tune, 389 unsigned int mode_flags, unsigned int *delay, 390 fe_status_t *status) 391{ 392 struct va1j5jf8007s_state *state; 393 int ret; 394 int lock = 0; 395 396 state = fe->demodulator_priv; 397 398 if (re_tune) 399 state->tune_state = VA1J5JF8007S_SET_FREQUENCY_1; 400 401 switch (state->tune_state) { 402 case VA1J5JF8007S_IDLE: 403 *delay = 3 * HZ; 404 *status = 0; 405 return 0; 406 407 case VA1J5JF8007S_SET_FREQUENCY_1: 408 ret = va1j5jf8007s_set_frequency_1(state); 409 if (ret < 0) 410 return ret; 411 412 state->tune_state = VA1J5JF8007S_SET_FREQUENCY_2; 413 *delay = 0; 414 *status = 0; 415 return 0; 416 417 case VA1J5JF8007S_SET_FREQUENCY_2: 418 ret = va1j5jf8007s_set_frequency_2(state); 419 if (ret < 0) 420 return ret; 421 422 state->tune_state = VA1J5JF8007S_SET_FREQUENCY_3; 423 *delay = (HZ + 99) / 100; 424 *status = 0; 425 return 0; 426 427 case VA1J5JF8007S_SET_FREQUENCY_3: 428 ret = va1j5jf8007s_set_frequency_3(state); 429 if (ret < 0) 430 return ret; 431 432 state->tune_state = VA1J5JF8007S_CHECK_FREQUENCY; 433 *delay = 0; 434 *status = 0; 435 return 0; 436 437 case VA1J5JF8007S_CHECK_FREQUENCY: 438 ret = va1j5jf8007s_check_frequency(state, &lock); 439 if (ret < 0) 440 return ret; 441 442 if (!lock) { 443 *delay = (HZ + 999) / 1000; 444 *status = 0; 445 return 0; 446 } 447 448 state->tune_state = VA1J5JF8007S_SET_MODULATION; 449 *delay = 0; 450 *status = FE_HAS_SIGNAL; 451 return 0; 452 453 case VA1J5JF8007S_SET_MODULATION: 454 ret = va1j5jf8007s_set_modulation(state); 455 if (ret < 0) 456 return ret; 457 458 state->tune_state = VA1J5JF8007S_CHECK_MODULATION; 459 *delay = 0; 460 *status = FE_HAS_SIGNAL; 461 return 0; 462 463 case VA1J5JF8007S_CHECK_MODULATION: 464 ret = va1j5jf8007s_check_modulation(state, &lock); 465 if (ret < 0) 466 return ret; 467 468 if (!lock) { 469 *delay = (HZ + 49) / 50; 470 *status = FE_HAS_SIGNAL; 471 return 0; 472 } 473 474 state->tune_state = VA1J5JF8007S_SET_TS_ID; 475 *delay = 0; 476 *status = FE_HAS_SIGNAL | FE_HAS_CARRIER; 477 return 0; 478 479 case VA1J5JF8007S_SET_TS_ID: 480 ret = va1j5jf8007s_set_ts_id(state); 481 if (ret < 0) 482 return ret; 483 484 state->tune_state = VA1J5JF8007S_CHECK_TS_ID; 485 return 0; 486 487 case VA1J5JF8007S_CHECK_TS_ID: 488 ret = va1j5jf8007s_check_ts_id(state, &lock); 489 if (ret < 0) 490 return ret; 491 492 if (!lock) { 493 *delay = (HZ + 99) / 100; 494 *status = FE_HAS_SIGNAL | FE_HAS_CARRIER; 495 return 0; 496 } 497 498 state->tune_state = VA1J5JF8007S_TRACK; 499 /* fall through */ 500 501 case VA1J5JF8007S_TRACK: 502 *delay = 3 * HZ; 503 *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_LOCK; 504 return 0; 505 } 506 507 BUG(); 508} 509 510static int va1j5jf8007s_init_frequency(struct va1j5jf8007s_state *state) 511{ 512 u8 buf[4]; 513 struct i2c_msg msg; 514 515 buf[0] = 0xfe; 516 buf[1] = 0xc0; 517 buf[2] = 0xf0; 518 buf[3] = 0x04; 519 520 msg.addr = state->config->demod_address; 521 msg.flags = 0; 522 msg.len = sizeof(buf); 523 msg.buf = buf; 524 525 if (i2c_transfer(state->adap, &msg, 1) != 1) 526 return -EREMOTEIO; 527 528 return 0; 529} 530 531static int va1j5jf8007s_set_sleep(struct va1j5jf8007s_state *state, int sleep) 532{ 533 u8 buf[2]; 534 struct i2c_msg msg; 535 536 buf[0] = 0x17; 537 buf[1] = sleep ? 0x01 : 0x00; 538 539 msg.addr = state->config->demod_address; 540 msg.flags = 0; 541 msg.len = sizeof(buf); 542 msg.buf = buf; 543 544 if (i2c_transfer(state->adap, &msg, 1) != 1) 545 return -EREMOTEIO; 546 547 return 0; 548} 549 550static int va1j5jf8007s_sleep(struct dvb_frontend *fe) 551{ 552 struct va1j5jf8007s_state *state; 553 int ret; 554 555 state = fe->demodulator_priv; 556 557 ret = va1j5jf8007s_init_frequency(state); 558 if (ret < 0) 559 return ret; 560 561 return va1j5jf8007s_set_sleep(state, 1); 562} 563 564static int va1j5jf8007s_init(struct dvb_frontend *fe) 565{ 566 struct va1j5jf8007s_state *state; 567 568 state = fe->demodulator_priv; 569 state->tune_state = VA1J5JF8007S_IDLE; 570 571 return va1j5jf8007s_set_sleep(state, 0); 572} 573 574static void va1j5jf8007s_release(struct dvb_frontend *fe) 575{ 576 struct va1j5jf8007s_state *state; 577 state = fe->demodulator_priv; 578 kfree(state); 579} 580 581static struct dvb_frontend_ops va1j5jf8007s_ops = { 582 .delsys = { SYS_ISDBS }, 583 .info = { 584 .name = "VA1J5JF8007/VA1J5JF8011 ISDB-S", 585 .frequency_min = 950000, 586 .frequency_max = 2150000, 587 .frequency_stepsize = 1000, 588 .caps = FE_CAN_INVERSION_AUTO | FE_CAN_FEC_AUTO | 589 FE_CAN_QAM_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO | 590 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO, 591 }, 592 593 .read_snr = va1j5jf8007s_read_snr, 594 .get_frontend_algo = va1j5jf8007s_get_frontend_algo, 595 .read_status = va1j5jf8007s_read_status, 596 .tune = va1j5jf8007s_tune, 597 .sleep = va1j5jf8007s_sleep, 598 .init = va1j5jf8007s_init, 599 .release = va1j5jf8007s_release, 600}; 601 602static int va1j5jf8007s_prepare_1(struct va1j5jf8007s_state *state) 603{ 604 u8 addr; 605 u8 write_buf[1], read_buf[1]; 606 struct i2c_msg msgs[2]; 607 608 addr = state->config->demod_address; 609 610 write_buf[0] = 0x07; 611 612 msgs[0].addr = addr; 613 msgs[0].flags = 0; 614 msgs[0].len = sizeof(write_buf); 615 msgs[0].buf = write_buf; 616 617 msgs[1].addr = addr; 618 msgs[1].flags = I2C_M_RD; 619 msgs[1].len = sizeof(read_buf); 620 msgs[1].buf = read_buf; 621 622 if (i2c_transfer(state->adap, msgs, 2) != 2) 623 return -EREMOTEIO; 624 625 if (read_buf[0] != 0x41) 626 return -EIO; 627 628 return 0; 629} 630 631static const u8 va1j5jf8007s_20mhz_prepare_bufs[][2] = { 632 {0x04, 0x02}, {0x0d, 0x55}, {0x11, 0x40}, {0x13, 0x80}, {0x17, 0x01}, 633 {0x1c, 0x0a}, {0x1d, 0xaa}, {0x1e, 0x20}, {0x1f, 0x88}, {0x51, 0xb0}, 634 {0x52, 0x89}, {0x53, 0xb3}, {0x5a, 0x2d}, {0x5b, 0xd3}, {0x85, 0x69}, 635 {0x87, 0x04}, {0x8e, 0x02}, {0xa3, 0xf7}, {0xa5, 0xc0}, 636}; 637 638static const u8 va1j5jf8007s_25mhz_prepare_bufs[][2] = { 639 {0x04, 0x02}, {0x11, 0x40}, {0x13, 0x80}, {0x17, 0x01}, {0x1c, 0x0a}, 640 {0x1d, 0xaa}, {0x1e, 0x20}, {0x1f, 0x88}, {0x51, 0xb0}, {0x52, 0x89}, 641 {0x53, 0xb3}, {0x5a, 0x2d}, {0x5b, 0xd3}, {0x85, 0x69}, {0x87, 0x04}, 642 {0x8e, 0x26}, {0xa3, 0xf7}, {0xa5, 0xc0}, 643}; 644 645static int va1j5jf8007s_prepare_2(struct va1j5jf8007s_state *state) 646{ 647 const u8 (*bufs)[2]; 648 int size; 649 u8 addr; 650 u8 buf[2]; 651 struct i2c_msg msg; 652 int i; 653 654 switch (state->config->frequency) { 655 case VA1J5JF8007S_20MHZ: 656 bufs = va1j5jf8007s_20mhz_prepare_bufs; 657 size = ARRAY_SIZE(va1j5jf8007s_20mhz_prepare_bufs); 658 break; 659 case VA1J5JF8007S_25MHZ: 660 bufs = va1j5jf8007s_25mhz_prepare_bufs; 661 size = ARRAY_SIZE(va1j5jf8007s_25mhz_prepare_bufs); 662 break; 663 default: 664 return -EINVAL; 665 } 666 667 addr = state->config->demod_address; 668 669 msg.addr = addr; 670 msg.flags = 0; 671 msg.len = 2; 672 msg.buf = buf; 673 for (i = 0; i < size; i++) { 674 memcpy(buf, bufs[i], sizeof(buf)); 675 if (i2c_transfer(state->adap, &msg, 1) != 1) 676 return -EREMOTEIO; 677 } 678 679 return 0; 680} 681 682/* must be called after va1j5jf8007t_attach */ 683int va1j5jf8007s_prepare(struct dvb_frontend *fe) 684{ 685 struct va1j5jf8007s_state *state; 686 int ret; 687 688 state = fe->demodulator_priv; 689 690 ret = va1j5jf8007s_prepare_1(state); 691 if (ret < 0) 692 return ret; 693 694 ret = va1j5jf8007s_prepare_2(state); 695 if (ret < 0) 696 return ret; 697 698 return va1j5jf8007s_init_frequency(state); 699} 700 701struct dvb_frontend * 702va1j5jf8007s_attach(const struct va1j5jf8007s_config *config, 703 struct i2c_adapter *adap) 704{ 705 struct va1j5jf8007s_state *state; 706 struct dvb_frontend *fe; 707 u8 buf[2]; 708 struct i2c_msg msg; 709 710 state = kzalloc(sizeof(struct va1j5jf8007s_state), GFP_KERNEL); 711 if (!state) 712 return NULL; 713 714 state->config = config; 715 state->adap = adap; 716 717 fe = &state->fe; 718 memcpy(&fe->ops, &va1j5jf8007s_ops, sizeof(struct dvb_frontend_ops)); 719 fe->demodulator_priv = state; 720 721 buf[0] = 0x01; 722 buf[1] = 0x80; 723 724 msg.addr = state->config->demod_address; 725 msg.flags = 0; 726 msg.len = sizeof(buf); 727 msg.buf = buf; 728 729 if (i2c_transfer(state->adap, &msg, 1) != 1) { 730 kfree(state); 731 return NULL; 732 } 733 734 return fe; 735} 736