10 static void detach_driver(struct usbdev_data
*data
)
12 libusb_detach_kernel_driver(data
->devh
, data
->interface
);
15 static void handle_generic(struct usbdev_data
*data
, struct blob_attr
**tb
)
20 static void handle_huawei(struct usbdev_data
*data
, struct blob_attr
**tb
)
25 static void handle_sierra(struct usbdev_data
*data
, struct blob_attr
**tb
)
30 static void handle_sony(struct usbdev_data
*data
, struct blob_attr
**tb
)
35 static void handle_qisda(struct usbdev_data
*data
, struct blob_attr
**tb
)
40 static void handle_gct(struct usbdev_data
*data
, struct blob_attr
**tb
)
46 static void handle_kobil(struct usbdev_data
*data
, struct blob_attr
**tb
)
52 static void handle_sequans(struct usbdev_data
*data
, struct blob_attr
**tb
)
57 static void handle_mobile_action(struct usbdev_data
*data
, struct blob_attr
**tb
)
62 static void handle_cisco(struct usbdev_data
*data
, struct blob_attr
**tb
)
84 void (*cb
)(struct usbdev_data
*data
, struct blob_attr
**tb
);
85 } modeswitch_cb
[__MODE_MAX
] = {
86 [MODE_GENERIC
] = { "Generic", handle_generic
},
87 [MODE_HUAWEI
] = { "Huawei", handle_huawei
},
88 [MODE_SIERRA
] = { "Sierra", handle_sierra
},
89 [MODE_SONY
] = { "Sony", handle_sony
},
90 [MODE_QISDA
] = { "Qisda", handle_qisda
},
91 [MODE_GCT
] = { "GCT", handle_gct
},
92 [MODE_KOBIL
] = { "Kobil", handle_kobil
},
93 [MODE_SEQUANS
] = { "Sequans", handle_sequans
},
94 [MODE_MOBILE_ACTION
] = { "MobileAction", handle_mobile_action
},
95 [MODE_CISCO
] = { "Cisco", handle_cisco
},
98 void handle_switch(struct usbdev_data
*data
)
100 static const struct blobmsg_policy data_policy
[__DATA_MAX
] = {
101 [DATA_MODE
] = { .name
= "mode", .type
= BLOBMSG_TYPE_STRING
},
102 [DATA_MSG
] = { .name
= "msg", .type
= BLOBMSG_TYPE_ARRAY
},
103 [DATA_INTERFACE
] = { .name
= "interface", .type
= BLOBMSG_TYPE_INT32
},
105 struct blob_attr
*tb
[__DATA_MAX
];
106 int mode
= MODE_GENERIC
;
108 blobmsg_parse(data_policy
, __DATA_MAX
, tb
, blobmsg_data(data
->info
), blobmsg_data_len(data
->info
));
110 if (tb
[DATA_INTERFACE
])
111 data
->interface
= blobmsg_get_u32(tb
[DATA_INTERFACE
]);
117 modestr
= blobmsg_data(tb
[DATA_MODE
]);
118 for (i
= 0; i
< __MODE_MAX
; i
++) {
119 if (strcmp(modeswitch_cb
[i
].name
, modestr
) != 0)
127 modeswitch_cb
[mode
].cb(data
, tb
);