mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2025-11-15 07:38:12 +00:00
drivers: Diminish fpi_ssm_get_user_data() usage
Can't remove it yet, as libusb transfers and timeouts don't pass the fp_dev or fp_img_dev separately.
This commit is contained in:
@@ -51,11 +51,14 @@ static void async_write_callback(struct libusb_transfer *transfer)
|
||||
}
|
||||
|
||||
/* Send data to EP1, the only out endpoint */
|
||||
static void async_write(fpi_ssm *ssm, void *data, int len)
|
||||
static void
|
||||
async_write(fpi_ssm *ssm,
|
||||
struct fp_img_dev *dev,
|
||||
void *data,
|
||||
int len)
|
||||
{
|
||||
struct fp_img_dev *idev = fpi_ssm_get_user_data(ssm);
|
||||
struct libusb_device_handle *usb_dev = fpi_dev_get_usb_dev(FP_DEV(idev));
|
||||
struct vfs_dev_t *vdev = FP_INSTANCE_DATA(FP_DEV(idev));
|
||||
struct libusb_device_handle *usb_dev = fpi_dev_get_usb_dev(FP_DEV(dev));
|
||||
struct vfs_dev_t *vdev = FP_INSTANCE_DATA(FP_DEV(dev));
|
||||
|
||||
vdev->transfer = libusb_alloc_transfer(0);
|
||||
vdev->transfer->flags |= LIBUSB_TRANSFER_FREE_TRANSFER;
|
||||
@@ -93,7 +96,12 @@ static void async_read_callback(struct libusb_transfer *transfer)
|
||||
}
|
||||
|
||||
/* Receive data from the given ep and compare with expected */
|
||||
static void async_read(fpi_ssm *ssm, int ep, void *data, int len)
|
||||
static void
|
||||
async_read(fpi_ssm *ssm,
|
||||
struct fp_img_dev *dev,
|
||||
int ep,
|
||||
void *data,
|
||||
int len)
|
||||
{
|
||||
struct fp_img_dev *idev = fpi_ssm_get_user_data(ssm);
|
||||
struct libusb_device_handle *usb_dev = fpi_dev_get_usb_dev(FP_DEV(idev));
|
||||
@@ -279,20 +287,21 @@ static void submit_image(struct fp_img_dev *idev)
|
||||
/* Proto functions */
|
||||
|
||||
/* SSM loop for clear_ep2 */
|
||||
static void clear_ep2_ssm(fpi_ssm *ssm, struct fp_dev *_dev, void *user_data)
|
||||
static void
|
||||
clear_ep2_ssm(fpi_ssm *ssm, struct fp_dev *_dev, void *user_data)
|
||||
{
|
||||
struct fp_img_dev *idev = fpi_ssm_get_user_data(ssm);
|
||||
struct fp_img_dev *idev = user_data;
|
||||
|
||||
short result;
|
||||
char command04 = 0x04;
|
||||
|
||||
switch (fpi_ssm_get_cur_state(ssm)) {
|
||||
case SUBSM1_COMMAND_04:
|
||||
async_write(ssm, &command04, sizeof(command04));
|
||||
async_write(ssm, idev, &command04, sizeof(command04));
|
||||
break;
|
||||
|
||||
case SUBSM1_RETURN_CODE:
|
||||
async_read(ssm, 1, &result, sizeof(result));
|
||||
async_read(ssm, idev, 1, &result, sizeof(result));
|
||||
break;
|
||||
|
||||
case SUBSM1_ABORT_2:
|
||||
@@ -307,10 +316,10 @@ static void clear_ep2_ssm(fpi_ssm *ssm, struct fp_dev *_dev, void *user_data)
|
||||
}
|
||||
|
||||
/* Send command to clear EP2 */
|
||||
static void clear_ep2(fpi_ssm *ssm)
|
||||
static void
|
||||
clear_ep2(fpi_ssm *ssm,
|
||||
struct fp_img_dev *idev)
|
||||
{
|
||||
struct fp_img_dev *idev = fpi_ssm_get_user_data(ssm);
|
||||
|
||||
fpi_ssm *subsm =
|
||||
fpi_ssm_new(FP_DEV(idev), clear_ep2_ssm, SUBSM1_STATES, idev);
|
||||
fpi_ssm_start_subsm(ssm, subsm);
|
||||
@@ -318,7 +327,7 @@ static void clear_ep2(fpi_ssm *ssm)
|
||||
|
||||
static void send_control_packet_ssm(fpi_ssm *ssm, struct fp_dev *_dev, void *user_data)
|
||||
{
|
||||
struct fp_img_dev *idev = fpi_ssm_get_user_data(ssm);
|
||||
struct fp_img_dev *idev = user_data;
|
||||
struct vfs_dev_t *vdev = FP_INSTANCE_DATA(FP_DEV(idev));
|
||||
|
||||
short result;
|
||||
@@ -326,11 +335,11 @@ static void send_control_packet_ssm(fpi_ssm *ssm, struct fp_dev *_dev, void *use
|
||||
|
||||
switch (fpi_ssm_get_cur_state(ssm)) {
|
||||
case SUBSM2_SEND_CONTROL:
|
||||
async_write(ssm, vdev->control_packet, VFS_CONTROL_PACKET_SIZE);
|
||||
async_write(ssm, idev, vdev->control_packet, VFS_CONTROL_PACKET_SIZE);
|
||||
break;
|
||||
|
||||
case SUBSM2_RETURN_CODE:
|
||||
async_read(ssm, 1, &result, sizeof(result));
|
||||
async_read(ssm, idev, 1, &result, sizeof(result));
|
||||
break;
|
||||
|
||||
case SUBSM2_SEND_COMMIT:
|
||||
@@ -341,19 +350,19 @@ static void send_control_packet_ssm(fpi_ssm *ssm, struct fp_dev *_dev, void *use
|
||||
break;
|
||||
}
|
||||
/* commit_out in Windows differs in each commit, but I send the same each time */
|
||||
async_write(ssm, commit_out, sizeof(commit_out));
|
||||
async_write(ssm, idev, commit_out, sizeof(commit_out));
|
||||
break;
|
||||
|
||||
case SUBSM2_COMMIT_RESPONSE:
|
||||
commit_result = g_malloc(VFS_COMMIT_RESPONSE_SIZE);
|
||||
async_read(ssm, 1, commit_result, VFS_COMMIT_RESPONSE_SIZE);
|
||||
async_read(ssm, idev, 1, commit_result, VFS_COMMIT_RESPONSE_SIZE);
|
||||
break;
|
||||
|
||||
case SUBSM2_READ_EMPTY_INTERRUPT:
|
||||
/* I don't know how to check result, it could be different */
|
||||
g_free(commit_result);
|
||||
|
||||
async_read(ssm, 3, vdev->interrupt, VFS_INTERRUPT_SIZE);
|
||||
async_read(ssm, idev, 3, vdev->interrupt, VFS_INTERRUPT_SIZE);
|
||||
break;
|
||||
|
||||
case SUBSM2_ABORT_3:
|
||||
@@ -371,7 +380,7 @@ static void send_control_packet_ssm(fpi_ssm *ssm, struct fp_dev *_dev, void *use
|
||||
case SUBSM2_CLEAR_EP2:
|
||||
/* After turn_on Windows doesn't clear EP2 */
|
||||
if (vdev->control_packet != turn_on)
|
||||
clear_ep2(ssm);
|
||||
clear_ep2(ssm, idev);
|
||||
else
|
||||
fpi_ssm_next_state(ssm);
|
||||
break;
|
||||
@@ -384,10 +393,10 @@ static void send_control_packet_ssm(fpi_ssm *ssm, struct fp_dev *_dev, void *use
|
||||
}
|
||||
|
||||
/* Send device state control packet */
|
||||
static void send_control_packet(fpi_ssm *ssm)
|
||||
static void
|
||||
send_control_packet(fpi_ssm *ssm,
|
||||
struct fp_img_dev *idev)
|
||||
{
|
||||
struct fp_img_dev *idev = fpi_ssm_get_user_data(ssm);
|
||||
|
||||
fpi_ssm *subsm =
|
||||
fpi_ssm_new(FP_DEV(idev), send_control_packet_ssm, SUBSM2_STATES, idev);
|
||||
fpi_ssm_start_subsm(ssm, subsm);
|
||||
@@ -518,7 +527,7 @@ static void scan_completed(void *data)
|
||||
/* Main SSM loop */
|
||||
static void activate_ssm(fpi_ssm *ssm, struct fp_dev *_dev, void *user_data)
|
||||
{
|
||||
struct fp_img_dev *idev = fpi_ssm_get_user_data(ssm);
|
||||
struct fp_img_dev *idev = user_data;
|
||||
struct libusb_device_handle *usb_dev = fpi_dev_get_usb_dev(FP_DEV(idev));
|
||||
struct vfs_dev_t *vdev = FP_INSTANCE_DATA(FP_DEV(idev));
|
||||
|
||||
@@ -536,14 +545,14 @@ static void activate_ssm(fpi_ssm *ssm, struct fp_dev *_dev, void *user_data)
|
||||
break;
|
||||
|
||||
case SSM_CLEAR_EP2:
|
||||
clear_ep2(ssm);
|
||||
clear_ep2(ssm, idev);
|
||||
break;
|
||||
|
||||
case SSM_TURN_OFF:
|
||||
/* Set control_packet argument */
|
||||
vdev->control_packet = turn_off;
|
||||
|
||||
send_control_packet(ssm);
|
||||
send_control_packet(ssm, idev);
|
||||
break;
|
||||
|
||||
case SSM_TURN_ON:
|
||||
@@ -560,7 +569,7 @@ static void activate_ssm(fpi_ssm *ssm, struct fp_dev *_dev, void *user_data)
|
||||
/* Set control_packet argument */
|
||||
vdev->control_packet = turn_on;
|
||||
|
||||
send_control_packet(ssm);
|
||||
send_control_packet(ssm, idev);
|
||||
break;
|
||||
|
||||
case SSM_ASK_INTERRUPT:
|
||||
@@ -651,7 +660,7 @@ static void activate_ssm(fpi_ssm *ssm, struct fp_dev *_dev, void *user_data)
|
||||
/* Set control_packet argument */
|
||||
vdev->control_packet = next_receive_1;
|
||||
|
||||
send_control_packet(ssm);
|
||||
send_control_packet(ssm, idev);
|
||||
break;
|
||||
|
||||
case SSM_WAIT_ANOTHER_SCAN:
|
||||
@@ -671,7 +680,7 @@ static void activate_ssm(fpi_ssm *ssm, struct fp_dev *_dev, void *user_data)
|
||||
/* Callback for dev_activate ssm */
|
||||
static void dev_activate_callback(fpi_ssm *ssm, struct fp_dev *_dev, void *user_data)
|
||||
{
|
||||
struct fp_img_dev *idev = fpi_ssm_get_user_data(ssm);
|
||||
struct fp_img_dev *idev = user_data;
|
||||
struct vfs_dev_t *vdev = FP_INSTANCE_DATA(FP_DEV(idev));
|
||||
|
||||
vdev->ssm_active = 0;
|
||||
@@ -713,7 +722,7 @@ static void dev_deactivate(struct fp_img_dev *idev)
|
||||
static void dev_open_callback(fpi_ssm *ssm, struct fp_dev *_dev, void *user_data)
|
||||
{
|
||||
/* Notify open complete */
|
||||
fpi_imgdev_open_complete(fpi_ssm_get_user_data(ssm), 0);
|
||||
fpi_imgdev_open_complete(user_data, 0);
|
||||
fpi_ssm_free(ssm);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user