drivers depend on it.
*/
-static DEFINE_IDR(serial_minors);
+static DEFINE_XARRAY_ALLOC(serial_minors);
static DEFINE_MUTEX(table_lock);
static LIST_HEAD(usb_serial_driver_list);
struct usb_serial_port *port;
mutex_lock(&table_lock);
- port = idr_find(&serial_minors, minor);
+ port = xa_load(&serial_minors, minor);
if (!port)
goto exit;
{
struct usb_serial_port *port;
unsigned int i, j;
- int minor;
+ int err;
dev_dbg(&serial->interface->dev, "%s %d\n", __func__, num_ports);
mutex_lock(&table_lock);
for (i = 0; i < num_ports; ++i) {
port = serial->port[i];
- minor = idr_alloc(&serial_minors, port, 0,
- USB_SERIAL_TTY_MINORS, GFP_KERNEL);
- if (minor < 0)
+ err = xa_alloc(&serial_minors, &port->minor, port,
+ XA_LIMIT(0, USB_SERIAL_TTY_MINORS - 1),
+ GFP_KERNEL);
+ if (err < 0)
goto error;
- port->minor = minor;
port->port_number = i;
}
serial->minors_reserved = 1;
error:
/* unwind the already allocated minors */
for (j = 0; j < i; ++j)
- idr_remove(&serial_minors, serial->port[j]->minor);
+ xa_erase(&serial_minors, serial->port[j]->minor);
mutex_unlock(&table_lock);
- return minor;
+ return err;
}
static void release_minors(struct usb_serial *serial)
mutex_lock(&table_lock);
for (i = 0; i < serial->num_ports; ++i)
- idr_remove(&serial_minors, serial->port[i]->minor);
+ xa_erase(&serial_minors, serial->port[i]->minor);
mutex_unlock(&table_lock);
serial->minors_reserved = 0;
}
tty_unregister_driver(usb_serial_tty_driver);
put_tty_driver(usb_serial_tty_driver);
bus_unregister(&usb_serial_bus_type);
- idr_destroy(&serial_minors);
}