diff --git linux-libre-4.4.282-gnu1/Makefile linux-libre-4.4.283-gnu1/Makefile
index 85a064f1c5a0..f86c0b1f9f75 100644
--- linux-libre-4.4.282-gnu1/Makefile
+++ linux-libre-4.4.283-gnu1/Makefile
@@ -1,6 +1,6 @@
 VERSION = 4
 PATCHLEVEL = 4
-SUBLEVEL = 282
+SUBLEVEL = 283
 EXTRAVERSION = -gnu1
 NAME = Blurry Fish Butt
 
diff --git linux-libre-4.4.282-gnu1/drivers/block/floppy.c linux-libre-4.4.283-gnu1/drivers/block/floppy.c
index ae6b798b76bb..40c251ef175d 100644
--- linux-libre-4.4.282-gnu1/drivers/block/floppy.c
+++ linux-libre-4.4.283-gnu1/drivers/block/floppy.c
@@ -4066,22 +4066,21 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
 	if (UFDCS->rawcmd == 1)
 		UFDCS->rawcmd = 2;
 
-	if (mode & (FMODE_READ|FMODE_WRITE)) {
-		UDRS->last_checked = 0;
-		clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
-		check_disk_change(bdev);
-		if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
-			goto out;
-		if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags))
+	if (!(mode & FMODE_NDELAY)) {
+		if (mode & (FMODE_READ|FMODE_WRITE)) {
+			UDRS->last_checked = 0;
+			clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
+			check_disk_change(bdev);
+			if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
+				goto out;
+			if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags))
+				goto out;
+		}
+		res = -EROFS;
+		if ((mode & FMODE_WRITE) &&
+		    !test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
 			goto out;
 	}
-
-	res = -EROFS;
-
-	if ((mode & FMODE_WRITE) &&
-			!test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
-		goto out;
-
 	mutex_unlock(&open_lock);
 	mutex_unlock(&floppy_mutex);
 	return 0;
diff --git linux-libre-4.4.282-gnu1/drivers/net/can/usb/esd_usb2.c linux-libre-4.4.283-gnu1/drivers/net/can/usb/esd_usb2.c
index a8ebdcbc8935..c1b1062bbc37 100644
--- linux-libre-4.4.282-gnu1/drivers/net/can/usb/esd_usb2.c
+++ linux-libre-4.4.283-gnu1/drivers/net/can/usb/esd_usb2.c
@@ -236,8 +236,8 @@ static void esd_usb2_rx_event(struct esd_usb2_net_priv *priv,
 	if (id == ESD_EV_CAN_ERROR_EXT) {
 		u8 state = msg->msg.rx.data[0];
 		u8 ecc = msg->msg.rx.data[1];
-		u8 txerr = msg->msg.rx.data[2];
-		u8 rxerr = msg->msg.rx.data[3];
+		u8 rxerr = msg->msg.rx.data[2];
+		u8 txerr = msg->msg.rx.data[3];
 
 		skb = alloc_can_err_skb(priv->netdev, &cf);
 		if (skb == NULL) {
diff --git linux-libre-4.4.282-gnu1/drivers/net/ethernet/intel/e1000e/ich8lan.c linux-libre-4.4.283-gnu1/drivers/net/ethernet/intel/e1000e/ich8lan.c
index 485b9cc53f8b..cd7403d09c3d 100644
--- linux-libre-4.4.282-gnu1/drivers/net/ethernet/intel/e1000e/ich8lan.c
+++ linux-libre-4.4.283-gnu1/drivers/net/ethernet/intel/e1000e/ich8lan.c
@@ -1010,6 +1010,8 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link)
 {
 	u32 reg = link << (E1000_LTRV_REQ_SHIFT + E1000_LTRV_NOSNOOP_SHIFT) |
 	    link << E1000_LTRV_REQ_SHIFT | E1000_LTRV_SEND;
+	u16 max_ltr_enc_d = 0;	/* maximum LTR decoded by platform */
+	u16 lat_enc_d = 0;	/* latency decoded */
 	u16 lat_enc = 0;	/* latency encoded */
 
 	if (link) {
@@ -1063,7 +1065,17 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link)
 				     E1000_PCI_LTR_CAP_LPT + 2, &max_nosnoop);
 		max_ltr_enc = max_t(u16, max_snoop, max_nosnoop);
 
-		if (lat_enc > max_ltr_enc)
+		lat_enc_d = (lat_enc & E1000_LTRV_VALUE_MASK) *
+			     (1U << (E1000_LTRV_SCALE_FACTOR *
+			     ((lat_enc & E1000_LTRV_SCALE_MASK)
+			     >> E1000_LTRV_SCALE_SHIFT)));
+
+		max_ltr_enc_d = (max_ltr_enc & E1000_LTRV_VALUE_MASK) *
+				 (1U << (E1000_LTRV_SCALE_FACTOR *
+				 ((max_ltr_enc & E1000_LTRV_SCALE_MASK)
+				 >> E1000_LTRV_SCALE_SHIFT)));
+
+		if (lat_enc_d > max_ltr_enc_d)
 			lat_enc = max_ltr_enc;
 	}
 
diff --git linux-libre-4.4.282-gnu1/drivers/net/ethernet/intel/e1000e/ich8lan.h linux-libre-4.4.283-gnu1/drivers/net/ethernet/intel/e1000e/ich8lan.h
index 34c551e322eb..3a16c457c8dd 100644
--- linux-libre-4.4.282-gnu1/drivers/net/ethernet/intel/e1000e/ich8lan.h
+++ linux-libre-4.4.283-gnu1/drivers/net/ethernet/intel/e1000e/ich8lan.h
@@ -284,8 +284,11 @@
 
 /* Latency Tolerance Reporting */
 #define E1000_LTRV			0x000F8
+#define E1000_LTRV_VALUE_MASK		0x000003FF
 #define E1000_LTRV_SCALE_MAX		5
 #define E1000_LTRV_SCALE_FACTOR		5
+#define E1000_LTRV_SCALE_SHIFT		10
+#define E1000_LTRV_SCALE_MASK		0x00001C00
 #define E1000_LTRV_REQ_SHIFT		15
 #define E1000_LTRV_NOSNOOP_SHIFT	16
 #define E1000_LTRV_SEND			(1 << 30)
diff --git linux-libre-4.4.282-gnu1/drivers/net/ethernet/marvell/mvneta.c linux-libre-4.4.283-gnu1/drivers/net/ethernet/marvell/mvneta.c
index 575da945f151..d6b25aba4004 100644
--- linux-libre-4.4.282-gnu1/drivers/net/ethernet/marvell/mvneta.c
+++ linux-libre-4.4.283-gnu1/drivers/net/ethernet/marvell/mvneta.c
@@ -90,7 +90,7 @@
 #define      MVNETA_DESC_SWAP                    BIT(6)
 #define      MVNETA_TX_BRST_SZ_MASK(burst)       ((burst) << 22)
 #define MVNETA_PORT_STATUS                       0x2444
-#define      MVNETA_TX_IN_PRGRS                  BIT(1)
+#define      MVNETA_TX_IN_PRGRS                  BIT(0)
 #define      MVNETA_TX_FIFO_EMPTY                BIT(8)
 #define MVNETA_RX_MIN_FRAME_SIZE                 0x247c
 #define MVNETA_SERDES_CFG			 0x24A0
diff --git linux-libre-4.4.282-gnu1/drivers/net/wireless/b43legacy/main.c linux-libre-4.4.283-gnu1/drivers/net/wireless/b43legacy/main.c
index ffd46af0fba4..a18a1580ac91 100644
--- linux-libre-4.4.282-gnu1/drivers/net/wireless/b43legacy/main.c
+++ linux-libre-4.4.283-gnu1/drivers/net/wireless/b43legacy/main.c
@@ -1598,20 +1598,20 @@ static void b43legacy_request_firmware(struct work_struct *work)
 
 	if (!fw->ucode) {
 		if (rev == 2)
-			filename = /*(DEBLOBBED)*/;
+			filename = "/*(DEBLOBBED)*/";
 		else if (rev == 4)
-			filename = /*(DEBLOBBED)*/;
+			filename = "/*(DEBLOBBED)*/";
 		else
-			filename = "ucode5";
+			filename = "/*(DEBLOBBED)*/";
 		err = do_request_fw(dev, filename, &fw->ucode, true);
 		if (err)
 			goto err_load;
 	}
 	if (!fw->pcm) {
 		if (rev < 5)
-			filename = /*(DEBLOBBED)*/;
+			filename = "/*(DEBLOBBED)*/";
 		else
-			filename = /*(DEBLOBBED)*/;
+			filename = "/*(DEBLOBBED)*/";
 		err = do_request_fw(dev, filename, &fw->pcm, false);
 		if (err)
 			goto err_load;
@@ -1621,9 +1621,9 @@ static void b43legacy_request_firmware(struct work_struct *work)
 		case B43legacy_PHYTYPE_B:
 		case B43legacy_PHYTYPE_G:
 			if ((rev >= 5) && (rev <= 10))
-				filename = "b0g0initvals5";
+				filename = "/*(DEBLOBBED)*/";
 			else if (rev == 2 || rev == 4)
-				filename = /*(DEBLOBBED)*/;
+				filename = "/*(DEBLOBBED)*/";
 			else
 				goto err_no_initvals;
 			break;
@@ -1639,7 +1639,7 @@ static void b43legacy_request_firmware(struct work_struct *work)
 		case B43legacy_PHYTYPE_B:
 		case B43legacy_PHYTYPE_G:
 			if ((rev >= 5) && (rev <= 10))
-				filename = "b0g0bsinitvals5";
+				filename = "/*(DEBLOBBED)*/";
 			else if (rev >= 11)
 				filename = NULL;
 			else if (rev == 2 || rev == 4)
diff --git linux-libre-4.4.282-gnu1/drivers/tty/vt/vt_ioctl.c linux-libre-4.4.283-gnu1/drivers/tty/vt/vt_ioctl.c
index e1a8f4121206..97475bb46f84 100644
--- linux-libre-4.4.282-gnu1/drivers/tty/vt/vt_ioctl.c
+++ linux-libre-4.4.283-gnu1/drivers/tty/vt/vt_ioctl.c
@@ -487,16 +487,19 @@ int vt_ioctl(struct tty_struct *tty,
 			ret = -EINVAL;
 			goto out;
 		}
-		/* FIXME: this needs the console lock extending */
-		if (vc->vc_mode == (unsigned char) arg)
+		console_lock();
+		if (vc->vc_mode == (unsigned char) arg) {
+			console_unlock();
 			break;
+		}
 		vc->vc_mode = (unsigned char) arg;
-		if (console != fg_console)
+		if (console != fg_console) {
+			console_unlock();
 			break;
+		}
 		/*
 		 * explicitly blank/unblank the screen if switching modes
 		 */
-		console_lock();
 		if (arg == KD_TEXT)
 			do_unblank_screen(1);
 		else
diff --git linux-libre-4.4.282-gnu1/drivers/usb/serial/ch341.c linux-libre-4.4.283-gnu1/drivers/usb/serial/ch341.c
index 3f3535d3c99e..2cff9c40f28a 100644
--- linux-libre-4.4.282-gnu1/drivers/usb/serial/ch341.c
+++ linux-libre-4.4.283-gnu1/drivers/usb/serial/ch341.c
@@ -585,7 +585,6 @@ static struct usb_serial_driver ch341_device = {
 		.owner	= THIS_MODULE,
 		.name	= "ch341-uart",
 	},
-	.bulk_in_size      = 512,
 	.id_table          = id_table,
 	.num_ports         = 1,
 	.open              = ch341_open,
diff --git linux-libre-4.4.282-gnu1/drivers/usb/serial/option.c linux-libre-4.4.283-gnu1/drivers/usb/serial/option.c
index b3336a7c09e0..02ded56bcbc6 100644
--- linux-libre-4.4.282-gnu1/drivers/usb/serial/option.c
+++ linux-libre-4.4.283-gnu1/drivers/usb/serial/option.c
@@ -2058,6 +2058,8 @@ static const struct usb_device_id option_ids[] = {
 	  .driver_info = RSVD(4) | RSVD(5) },
 	{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0105, 0xff),			/* Fibocom NL678 series */
 	  .driver_info = RSVD(6) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) },	/* Fibocom FG150 Diag */
+	{ USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) },		/* Fibocom FG150 AT */
 	{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) },			/* Fibocom NL668-AM/NL652-EU (laptop MBIM) */
 	{ USB_DEVICE_INTERFACE_CLASS(0x2df3, 0x9d03, 0xff) },			/* LongSung M5710 */
 	{ USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) },			/* GosunCn GM500 RNDIS */
diff --git linux-libre-4.4.282-gnu1/drivers/vhost/vringh.c linux-libre-4.4.283-gnu1/drivers/vhost/vringh.c
index d56736655dec..da47542496cc 100644
--- linux-libre-4.4.282-gnu1/drivers/vhost/vringh.c
+++ linux-libre-4.4.283-gnu1/drivers/vhost/vringh.c
@@ -329,7 +329,7 @@ __vringh_iov(struct vringh *vrh, u16 i,
 			iov = wiov;
 		else {
 			iov = riov;
-			if (unlikely(wiov && wiov->i)) {
+			if (unlikely(wiov && wiov->used)) {
 				vringh_bad("Readable desc %p after writable",
 					   &descs[i]);
 				err = -EINVAL;
diff --git linux-libre-4.4.282-gnu1/drivers/video/fbdev/core/fbmem.c linux-libre-4.4.283-gnu1/drivers/video/fbdev/core/fbmem.c
index 348be7368f49..afb84c27110d 100644
--- linux-libre-4.4.282-gnu1/drivers/video/fbdev/core/fbmem.c
+++ linux-libre-4.4.283-gnu1/drivers/video/fbdev/core/fbmem.c
@@ -1001,6 +1001,10 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
 			goto done;
 		}
 
+		/* bitfill_aligned() assumes that it's at least 8x8 */
+		if (var->xres < 8 || var->yres < 8)
+			return -EINVAL;
+
 		ret = info->fbops->fb_check_var(var, info);
 
 		if (ret)
diff --git linux-libre-4.4.282-gnu1/drivers/virtio/virtio_ring.c linux-libre-4.4.283-gnu1/drivers/virtio/virtio_ring.c
index 6b3565feddb2..b15c24c4d91f 100644
--- linux-libre-4.4.282-gnu1/drivers/virtio/virtio_ring.c
+++ linux-libre-4.4.283-gnu1/drivers/virtio/virtio_ring.c
@@ -840,7 +840,7 @@ bool virtqueue_is_broken(struct virtqueue *_vq)
 {
 	struct vring_virtqueue *vq = to_vvq(_vq);
 
-	return vq->broken;
+	return READ_ONCE(vq->broken);
 }
 EXPORT_SYMBOL_GPL(virtqueue_is_broken);
 
@@ -854,7 +854,9 @@ void virtio_break_device(struct virtio_device *dev)
 
 	list_for_each_entry(_vq, &dev->vqs, list) {
 		struct vring_virtqueue *vq = to_vvq(_vq);
-		vq->broken = true;
+
+		/* Pairs with READ_ONCE() in virtqueue_is_broken(). */
+		WRITE_ONCE(vq->broken, true);
 	}
 }
 EXPORT_SYMBOL_GPL(virtio_break_device);
