/* Maximum repeat count for USB error recovery */
#define MTP_USB_ERROR_MAX_RETRY 5
+mtp_bool _transport_select_driver(void);
mtp_bool _transport_init_usb_device(void);
void _transport_deinit_usb_device(void);
void *_transport_thread_usb_write(void *arg);
mtp_int32 ret;
phone_status_t val = 0;
- _util_get_usb_status(&val);
- _util_set_local_usb_status(val);
- ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_USB_STATUS,
- __handle_usb_notification, NULL);
- if (ret < 0) {
- ERR("vconf_notify_key_changed(%s) Fail", VCONFKEY_SYSMAN_USB_STATUS);
- return FALSE;
- }
+ /* For FFS transport we rely on ep0 events */
+ if (_transport_get_type() == MTP_TRANSPORT_FFS) {
+ DBG("Using FFS transport, assuming established connection");
+ _util_set_local_usb_status(MTP_PHONE_USB_DISCONNECTED);
+ _util_set_local_usbmode_status(1);
+ } else {
+ DBG("Using legacy transport, registering vconf notifier");
+ _util_get_usb_status(&val);
+ _util_set_local_usb_status(val);
+ ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_USB_STATUS,
+ __handle_usb_notification, NULL);
+ if (ret < 0) {
+ ERR("vconf_notify_key_changed(%s) Fail", VCONFKEY_SYSMAN_USB_STATUS);
+ return FALSE;
+ }
- _util_get_usbmode_status(&val);
- _util_set_local_usbmode_status(val);
- ret = vconf_notify_key_changed(VCONFKEY_USB_CUR_MODE,
- __handle_usb_mode_notification, NULL);
- if (ret < 0) {
- ERR("vconf_notify_key_changed(%s) Fail", VCONFKEY_USB_CUR_MODE);
- return FALSE;
+ _util_get_usbmode_status(&val);
+ _util_set_local_usbmode_status(val);
+ ret = vconf_notify_key_changed(VCONFKEY_USB_CUR_MODE,
+ __handle_usb_mode_notification, NULL);
+ if (ret < 0) {
+ ERR("vconf_notify_key_changed(%s) Fail", VCONFKEY_USB_CUR_MODE);
+ return FALSE;
+ }
}
_util_get_lock_status(&val);
return TRUE;
}
- is_usb_inserted = 1;
/* check USB connection state */
- if (MTP_PHONE_USB_DISCONNECTED == _util_get_local_usb_status()) {
+ if (_transport_get_type() != MTP_TRANSPORT_FFS &&
+ MTP_PHONE_USB_DISCONNECTED == _util_get_local_usb_status()) {
ERR("USB is disconnected. So just return.");
return FALSE;
}
+ is_usb_inserted = 1;
_transport_set_usb_discon_state(FALSE);
_transport_set_cancel_initialization(FALSE);
#include "mtp_transport.h"
#include "mtp_util.h"
#include "mtp_media_info.h"
+#include "mtp_usb_driver.h"
/*
* GLOBAL AND EXTERN VARIABLES
{
mtp_int32 ret;
+ if (_transport_select_driver() == FALSE) {
+ ERR("_transport_select_driver fail");
+ return MTP_ERROR_GENERAL;
+ }
+
if (_eh_register_notification_callbacks() == FALSE) {
ERR("_eh_register_notification_callbacks() Fail");
return MTP_ERROR_GENERAL;
/*
* FUNCTIONS
*/
-mtp_bool _transport_init_usb_device(void)
+mtp_bool _transport_select_driver(void)
{
if (access(MTP_DRIVER_PATH, F_OK) == 0) {
usb_driver = &mtp_usb_driver_slp;
- } else if (access(MTP_EP0_PATH, F_OK) == 0 || sd_listen_fds(0) >= 4) {
+ DBG("SLP driver selected");
+ return TRUE;
+ }
+
+ if (access(MTP_EP0_PATH, F_OK) == 0 || sd_listen_fds(0) >= 4) {
usb_driver = &mtp_usb_driver_ffs;
- } else {
- ERR("No suport for USB gadgets in kernel");
- return FALSE;
+ DBG("FFS driver selected");
+ return TRUE;
}
+ ERR("No suport for USB gadgets in kernel");
+ return FALSE;
+}
+
+mtp_bool _transport_init_usb_device(void)
+{
return usb_driver->transport_init_usb_device();
}
#include "mtp_thread.h"
#include "mtp_transport.h"
#include "mtp_event_handler.h"
+#include "mtp_init.h"
#include <sys/prctl.h>
#include <systemd/sd-daemon.h>
int ret;
if (sd_listen_fds(0) >= 4) {
+ DBG("socket-activated");
g_usb_ep0 = SD_LISTEN_FDS_START;
g_usb_ep_in = SD_LISTEN_FDS_START + 1;
g_usb_ep_out = SD_LISTEN_FDS_START + 2;
event.u.setup.wLength);
__setup(g_usb_ep0, &event.u.setup);
break;
+ case FUNCTIONFS_ENABLE:
+ DBG("ENABLE");
+ _util_set_local_usb_status(MTP_PHONE_USB_CONNECTED);
+ break;
+ case FUNCTIONFS_DISABLE:
+ DBG("DISABLE");
+ _util_set_local_usb_status(MTP_PHONE_USB_DISCONNECTED);
+ _eh_send_event_req_to_eh_thread(EVENT_USB_REMOVED, 0, 0, NULL);
+ break;
}
} while (status > 0);
ERR("_transport_init_usb_device Fail");
continue;
}
+ } else if (err < 0 && errno == ESHUTDOWN) {
+ DBG("ESHUTDOWN");
} else {
ERR("Unknown error : %d, errno [%d] \n", err, errno);
break;
{
mtp_int32 len = 0;
msgq_ptr_t pkt = { 0 };
- msgq_id_t l_mqid = *(msgq_id_t *)mq_id;
+ msgq_id_t l_mqid;
ret_if(mq_id == NULL);
+ l_mqid = *(msgq_id_t *)mq_id;
_transport_set_control_event(PTP_EVENTCODE_CANCELTRANSACTION);
while (TRUE == _util_msgq_receive(l_mqid, (void *)&pkt,
sizeof(msgq_ptr_t) - sizeof(long), 1, &len)) {