Commit f208a76f authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'staging-5.8-rc7' of...

Merge tag 'staging-5.8-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging into master

Pull staging driver fixes from Greg KH:
 "Five small staging driver fixes for 5.8-rc7 to resolve some reported
  problems:

   - four comedi driver fixes for problems found with them

   - a syzbot-found fix for the wlang-ng driver that resolves a much
     reported problem.

  All of these have been in linux-next with no reported issues"

* tag 'staging-5.8-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging:
  staging: wlan-ng: properly check endpoint types
  staging: comedi: addi_apci_1564: check INSN_CONFIG_DIGITAL_TRIG shift
  staging: comedi: addi_apci_1500: check INSN_CONFIG_DIGITAL_TRIG shift
  staging: comedi: addi_apci_1032: check INSN_CONFIG_DIGITAL_TRIG shift
  staging: comedi: ni_6527: fix INSN_CONFIG_DIGITAL_TRIG support
parents 7d22af6c faaff976
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -106,14 +106,22 @@ static int apci1032_cos_insn_config(struct comedi_device *dev,
				    unsigned int *data)
{
	struct apci1032_private *devpriv = dev->private;
	unsigned int shift, oldmask;
	unsigned int shift, oldmask, himask, lomask;

	switch (data[0]) {
	case INSN_CONFIG_DIGITAL_TRIG:
		if (data[1] != 0)
			return -EINVAL;
		shift = data[3];
		if (shift < 32) {
			oldmask = (1U << shift) - 1;
			himask = data[4] << shift;
			lomask = data[5] << shift;
		} else {
			oldmask = 0xffffffffu;
			himask = 0;
			lomask = 0;
		}
		switch (data[2]) {
		case COMEDI_DIGITAL_TRIG_DISABLE:
			devpriv->ctrl = 0;
@@ -136,8 +144,8 @@ static int apci1032_cos_insn_config(struct comedi_device *dev,
				devpriv->mode2 &= oldmask;
			}
			/* configure specified channels */
			devpriv->mode1 |= data[4] << shift;
			devpriv->mode2 |= data[5] << shift;
			devpriv->mode1 |= himask;
			devpriv->mode2 |= lomask;
			break;
		case COMEDI_DIGITAL_TRIG_ENABLE_LEVELS:
			if (devpriv->ctrl != (APCI1032_CTRL_INT_ENA |
@@ -154,8 +162,8 @@ static int apci1032_cos_insn_config(struct comedi_device *dev,
				devpriv->mode2 &= oldmask;
			}
			/* configure specified channels */
			devpriv->mode1 |= data[4] << shift;
			devpriv->mode2 |= data[5] << shift;
			devpriv->mode1 |= himask;
			devpriv->mode2 |= lomask;
			break;
		default:
			return -EINVAL;
+19 −5
Original line number Diff line number Diff line
@@ -452,13 +452,14 @@ static int apci1500_di_cfg_trig(struct comedi_device *dev,
	struct apci1500_private *devpriv = dev->private;
	unsigned int trig = data[1];
	unsigned int shift = data[3];
	unsigned int hi_mask = data[4] << shift;
	unsigned int lo_mask = data[5] << shift;
	unsigned int chan_mask = hi_mask | lo_mask;
	unsigned int old_mask = (1 << shift) - 1;
	unsigned int hi_mask;
	unsigned int lo_mask;
	unsigned int chan_mask;
	unsigned int old_mask;
	unsigned int pm;
	unsigned int pt;
	unsigned int pp;
	unsigned int invalid_chan;

	if (trig > 1) {
		dev_dbg(dev->class_dev,
@@ -466,7 +467,20 @@ static int apci1500_di_cfg_trig(struct comedi_device *dev,
		return -EINVAL;
	}

	if (chan_mask > 0xffff) {
	if (shift <= 16) {
		hi_mask = data[4] << shift;
		lo_mask = data[5] << shift;
		old_mask = (1U << shift) - 1;
		invalid_chan = (data[4] | data[5]) >> (16 - shift);
	} else {
		hi_mask = 0;
		lo_mask = 0;
		old_mask = 0xffff;
		invalid_chan = data[4] | data[5];
	}
	chan_mask = hi_mask | lo_mask;

	if (invalid_chan) {
		dev_dbg(dev->class_dev, "invalid digital trigger channel\n");
		return -EINVAL;
	}
+14 −6
Original line number Diff line number Diff line
@@ -331,14 +331,22 @@ static int apci1564_cos_insn_config(struct comedi_device *dev,
				    unsigned int *data)
{
	struct apci1564_private *devpriv = dev->private;
	unsigned int shift, oldmask;
	unsigned int shift, oldmask, himask, lomask;

	switch (data[0]) {
	case INSN_CONFIG_DIGITAL_TRIG:
		if (data[1] != 0)
			return -EINVAL;
		shift = data[3];
		if (shift < 32) {
			oldmask = (1U << shift) - 1;
			himask = data[4] << shift;
			lomask = data[5] << shift;
		} else {
			oldmask = 0xffffffffu;
			himask = 0;
			lomask = 0;
		}
		switch (data[2]) {
		case COMEDI_DIGITAL_TRIG_DISABLE:
			devpriv->ctrl = 0;
@@ -362,8 +370,8 @@ static int apci1564_cos_insn_config(struct comedi_device *dev,
				devpriv->mode2 &= oldmask;
			}
			/* configure specified channels */
			devpriv->mode1 |= data[4] << shift;
			devpriv->mode2 |= data[5] << shift;
			devpriv->mode1 |= himask;
			devpriv->mode2 |= lomask;
			break;
		case COMEDI_DIGITAL_TRIG_ENABLE_LEVELS:
			if (devpriv->ctrl != (APCI1564_DI_IRQ_ENA |
@@ -380,8 +388,8 @@ static int apci1564_cos_insn_config(struct comedi_device *dev,
				devpriv->mode2 &= oldmask;
			}
			/* configure specified channels */
			devpriv->mode1 |= data[4] << shift;
			devpriv->mode2 |= data[5] << shift;
			devpriv->mode1 |= himask;
			devpriv->mode2 |= lomask;
			break;
		default:
			return -EINVAL;
+1 −1
Original line number Diff line number Diff line
@@ -332,7 +332,7 @@ static int ni6527_intr_insn_config(struct comedi_device *dev,
		case COMEDI_DIGITAL_TRIG_ENABLE_EDGES:
			/* check shift amount */
			shift = data[3];
			if (shift >= s->n_chan) {
			if (shift >= 32) {
				mask = 0;
				rising = 0;
				falling = 0;
+15 −1
Original line number Diff line number Diff line
@@ -61,11 +61,25 @@ static int prism2sta_probe_usb(struct usb_interface *interface,
			       const struct usb_device_id *id)
{
	struct usb_device *dev;

	const struct usb_endpoint_descriptor *epd;
	const struct usb_host_interface *iface_desc = interface->cur_altsetting;
	struct wlandevice *wlandev = NULL;
	struct hfa384x *hw = NULL;
	int result = 0;

	if (iface_desc->desc.bNumEndpoints != 2) {
		result = -ENODEV;
		goto failed;
	}

	result = -EINVAL;
	epd = &iface_desc->endpoint[1].desc;
	if (!usb_endpoint_is_bulk_in(epd))
		goto failed;
	epd = &iface_desc->endpoint[2].desc;
	if (!usb_endpoint_is_bulk_out(epd))
		goto failed;

	dev = interface_to_usbdev(interface);
	wlandev = create_wlan();
	if (!wlandev) {