Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35644b0c authored by Duncan Sands's avatar Duncan Sands Committed by Greg Kroah-Hartman
Browse files

[PATCH] USBATM: add flags field



Have minidrivers and the core signal special requirements
using a flags field in struct usbatm_data.  For the moment
this is only used to replace the need_heavy_init bind
parameter, but there'll be new flags in later patches.

Signed-off-by: default avatarDuncan Sands <baldrick@free.fr>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 0ec3c7e8
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -666,8 +666,7 @@ static int cxacru_heavy_init(struct usbatm_data *usbatm_instance,
}

static int cxacru_bind(struct usbatm_data *usbatm_instance,
		       struct usb_interface *intf, const struct usb_device_id *id,
		       int *need_heavy_init)
		       struct usb_interface *intf, const struct usb_device_id *id)
{
	struct cxacru_data *instance;
	struct usb_device *usb_dev = interface_to_usbdev(intf);
@@ -726,7 +725,7 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance,

	usbatm_instance->driver_data = instance;

	*need_heavy_init = cxacru_card_status(instance);
	usbatm_instance->flags = (cxacru_card_status(instance) ? 0 : UDSL_SKIP_HEAVY_INIT);

	return 0;

+4 −5
Original line number Diff line number Diff line
@@ -681,8 +681,7 @@ static void speedtch_release_interfaces(struct usb_device *usb_dev, int num_inte

static int speedtch_bind(struct usbatm_data *usbatm,
			 struct usb_interface *intf,
			 const struct usb_device_id *id,
			 int *need_heavy_init)
			 const struct usb_device_id *id)
{
	struct usb_device *usb_dev = interface_to_usbdev(intf);
	struct usb_interface *cur_intf;
@@ -754,11 +753,11 @@ static int speedtch_bind(struct usbatm_data *usbatm,
			      0x12, 0xc0, 0x07, 0x00,
			      instance->scratch_buffer + OFFSET_7, SIZE_7, 500);

	*need_heavy_init = (ret != SIZE_7);
	usbatm->flags = (ret == SIZE_7 ? UDSL_SKIP_HEAVY_INIT : 0);

	usb_dbg(usbatm, "%s: firmware %s loaded\n", __func__, need_heavy_init ? "not" : "already");
	usb_dbg(usbatm, "%s: firmware %s loaded\n", __func__, usbatm->flags & UDSL_SKIP_HEAVY_INIT ? "already" : "not");

	if (*need_heavy_init)
	if (!(usbatm->flags & UDSL_SKIP_HEAVY_INIT))
		if ((ret = usb_reset_device(usb_dev)) < 0) {
			usb_err(usbatm, "%s: device reset failed (%d)!\n", __func__, ret);
			goto fail_free;
+2 −2
Original line number Diff line number Diff line
@@ -1617,7 +1617,7 @@ static void create_fs_entries(struct uea_softc *sc, struct usb_interface *intf)
}

static int uea_bind(struct usbatm_data *usbatm, struct usb_interface *intf,
		   const struct usb_device_id *id, int *heavy)
		   const struct usb_device_id *id)
{
	struct usb_device *usb = interface_to_usbdev(intf);
	struct uea_softc *sc;
@@ -1629,7 +1629,7 @@ static int uea_bind(struct usbatm_data *usbatm, struct usb_interface *intf,
	if (ifnum != UEA_INTR_IFACE_NO)
		return -ENODEV;

	*heavy = sync_wait[modem_index];
	usbatm_instance->flags = (sync_wait[modem_index] ? 0 : UDSL_SKIP_HEAVY_INIT);

	/* interface 1 is for outbound traffic */
	ret = claim_interface(usb, usbatm, UEA_US_IFACE_NO);
+2 −4
Original line number Diff line number Diff line
@@ -969,7 +969,6 @@ int usbatm_usb_probe(struct usb_interface *intf, const struct usb_device_id *id,
	char *buf;
	int error = -ENOMEM;
	int i, length;
	int need_heavy;

	dev_dbg(dev, "%s: trying driver %s with vendor=%04x, product=%04x, ifnum %2d\n",
			__func__, driver->driver_name,
@@ -1014,8 +1013,7 @@ int usbatm_usb_probe(struct usb_interface *intf, const struct usb_device_id *id,
	snprintf(buf, length, ")");

 bind:
	need_heavy = 1;
	if (driver->bind && (error = driver->bind(instance, intf, id, &need_heavy)) < 0) {
	if (driver->bind && (error = driver->bind(instance, intf, id)) < 0) {
			dev_err(dev, "%s: bind failed: %d!\n", __func__, error);
			goto fail_free;
	}
@@ -1098,7 +1096,7 @@ int usbatm_usb_probe(struct usb_interface *intf, const struct usb_device_id *id,
		     __func__, urb->transfer_buffer, urb->transfer_buffer_length, urb);
	}

	if (need_heavy && driver->heavy_init) {
	if (!(instance->flags & UDSL_SKIP_HEAVY_INIT) && driver->heavy_init) {
		error = usbatm_heavy_init(instance);
	} else {
		complete(&instance->thread_exited);	/* pretend that heavy_init was run */
+8 −5
Original line number Diff line number Diff line
@@ -84,6 +84,11 @@
#endif


/* flags, set by mini-driver in bind() */

#define UDSL_SKIP_HEAVY_INIT	(1<<0)


/* mini driver */

struct usbatm_data;
@@ -99,12 +104,9 @@ struct usbatm_driver {

	const char *driver_name;

	/*
	*  init device ... can sleep, or cause probe() failure.  Drivers with a heavy_init
	*  method can avoid having it called by setting need_heavy_init to zero.
	*/
	/* init device ... can sleep, or cause probe() failure */
        int (*bind) (struct usbatm_data *, struct usb_interface *,
		     const struct usb_device_id *id, int *need_heavy_init);
		     const struct usb_device_id *id);

	/* additional device initialization that is too slow to be done in probe() */
        int (*heavy_init) (struct usbatm_data *, struct usb_interface *);
@@ -152,6 +154,7 @@ struct usbatm_data {
	struct usbatm_driver *driver;
	void *driver_data;
	char driver_name[16];
	unsigned int flags; /* set by mini-driver in bind() */

	/* USB device */
	struct usb_device *usb_dev;
Loading