--- 793f06399baab61880074474d67513ceab5bd5fc +++ 48279ee620b85fc3adfa0642af68f78871e64040 @@ -1588,8 +1588,8 @@ static void hci_cc_fm_disable_rsp(struct if (status) return; - - iris_q_event(radio, IRIS_EVT_RADIO_DISABLED); + if (radio->mode != FM_CALIB) + iris_q_event(radio, IRIS_EVT_RADIO_DISABLED); radio_hci_req_complete(hdev, status); } @@ -1627,8 +1627,8 @@ static void hci_cc_fm_enable_rsp(struct if (rsp->status) return; - - iris_q_event(radio, IRIS_EVT_RADIO_READY); + if (radio->mode != FM_CALIB) + iris_q_event(radio, IRIS_EVT_RADIO_READY); radio_hci_req_complete(hdev, rsp->status); } @@ -1879,6 +1879,7 @@ static inline void hci_cmd_complete_even switch (opcode) { case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_ENABLE_RECV_REQ): + case hci_trans_ctrl_cmd_op_pack(HCI_OCF_FM_ENABLE_TRANS_REQ): hci_cc_fm_enable_rsp(hdev, skb); break; case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_RECV_CONF_REQ): @@ -1886,6 +1887,7 @@ static inline void hci_cmd_complete_even break; case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_DISABLE_RECV_REQ): + case hci_trans_ctrl_cmd_op_pack(HCI_OCF_FM_DISABLE_TRANS_REQ): hci_cc_fm_disable_rsp(hdev, skb); break; @@ -1900,8 +1902,6 @@ static inline void hci_cmd_complete_even case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_EN_WAN_AVD_CTRL): case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_EN_NOTCH_CTRL): case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_CH_DET_THRESHOLD): - case hci_trans_ctrl_cmd_op_pack(HCI_OCF_FM_ENABLE_TRANS_REQ): - case hci_trans_ctrl_cmd_op_pack(HCI_OCF_FM_DISABLE_TRANS_REQ): case hci_trans_ctrl_cmd_op_pack(HCI_OCF_FM_RDS_RT_REQ): case hci_trans_ctrl_cmd_op_pack(HCI_OCF_FM_RDS_PS_REQ): case hci_common_cmd_op_pack(HCI_OCF_FM_DEFAULT_DATA_WRITE): @@ -2461,23 +2461,27 @@ static int iris_do_calibration(struct ir int retval = 0x00; cal_mode = PROCS_CALIB_MODE; + radio->mode = FM_CALIB; retval = hci_cmd(HCI_FM_ENABLE_RECV_CMD, radio->fm_hdev); if (retval < 0) { FMDERR("Enable failed before calibration %x", retval); + radio->mode = FM_OFF; return retval; } retval = radio_hci_request(radio->fm_hdev, hci_fm_do_cal_req, (unsigned long)cal_mode, RADIO_HCI_TIMEOUT); if (retval < 0) { FMDERR("Do Process calibration failed %x", retval); + radio->mode = FM_RECV; return retval; } retval = hci_cmd(HCI_FM_DISABLE_RECV_CMD, radio->fm_hdev); if (retval < 0) FMDERR("Disable Failed after calibration %d", retval); - return retval; + radio->mode = FM_OFF; + return retval; } static int iris_vidioc_g_ctrl(struct file *file, void *priv, struct v4l2_control *ctrl) @@ -2850,12 +2854,12 @@ static int iris_vidioc_s_ctrl(struct fil case FM_TRANS: retval = hci_cmd(HCI_FM_ENABLE_TRANS_CMD, radio->fm_hdev); - radio->mode = FM_TRANS; if (retval < 0) { FMDERR("Error while enabling TRANS FM" " %d\n", retval); return retval; } + radio->mode = FM_TRANS; retval = hci_cmd(HCI_FM_GET_TX_CONFIG, radio->fm_hdev); if (retval < 0) FMDERR("get frequency failed %d\n", retval); @@ -2865,17 +2869,23 @@ static int iris_vidioc_s_ctrl(struct fil case FM_RECV: retval = hci_cmd(HCI_FM_DISABLE_RECV_CMD, radio->fm_hdev); - if (retval < 0) + if (retval < 0) { FMDERR("Err on disable recv FM" " %d\n", retval); + return retval; + } + radio->mode = FM_OFF; break; case FM_TRANS: retval = hci_cmd(HCI_FM_DISABLE_TRANS_CMD, radio->fm_hdev); - if (retval < 0) + if (retval < 0) { FMDERR("Err disabling trans FM" " %d\n", retval); + return retval; + } + radio->mode = FM_OFF; break; default: retval = -EINVAL;