Index: uspace/drv/bus/usb/vhc/conndev.c
===================================================================
--- uspace/drv/bus/usb/vhc/conndev.c	(revision 870841cf500de256e7549deb8adf082aa90a11ce)
+++ uspace/drv/bus/usb/vhc/conndev.c	(revision 113fb4f7d41823fcc1ee75be3d89b3ccb0cb247e)
@@ -43,7 +43,26 @@
 #include "vhcd.h"
 
+#define PLUGGED_DEVICE_NAME_MAXLEN 256
+
 static fibril_local uintptr_t plugged_device_handle = 0;
-#define PLUGGED_DEVICE_NAME_MAXLEN 256
-static fibril_local char plugged_device_name[PLUGGED_DEVICE_NAME_MAXLEN + 1] = "<unknown>";
+
+/*
+ * The explicit "initial-exec" TLS model attribute is a temporary workaround
+ * for a bug in GCC (observed in 14.2 and 15.2) that manifests in combination
+ * with the binutils 2.45 linker on MIPS.
+ *
+ * Without the attribute, the linker reports the following error:
+ *
+ *  can't find matching LO16 reloc against `plugged_device_name' for
+ *  R_MIPS_TLS_TPREL_HI16 at 0x238 in section
+ *  `.text.default_connection_handler'
+ *
+ * The immediate cause is a missing R_MIPS_TLS_TPREL_LO16 relocation that
+ * matches the R_MIPS_TLS_TPREL_HI16 relocation. The root cause is probably
+ * an aggressive optimization in the compiler that removes the relocation
+ * despite being needed.
+ */
+static fibril_local char plugged_device_name[PLUGGED_DEVICE_NAME_MAXLEN + 1]
+    __attribute__((tls_model("initial-exec"))) = "<unknown>";
 
 /** Receive device name.
Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision 870841cf500de256e7549deb8adf082aa90a11ce)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision 113fb4f7d41823fcc1ee75be3d89b3ccb0cb247e)
@@ -166,5 +166,5 @@
 					speeds[psiv].major = major;
 					speeds[psiv].minor = minor;
-					str_ncpy(speeds[psiv].name, 4, name.str, 4);
+					memcpy(speeds[psiv].name, name.str, 4);
 					speeds[psiv].usb_speed = USB_SPEED_MAX;
 
Index: uspace/drv/bus/usb/xhci/hw_struct/regs.h
===================================================================
--- uspace/drv/bus/usb/xhci/hw_struct/regs.h	(revision 870841cf500de256e7549deb8adf082aa90a11ce)
+++ uspace/drv/bus/usb/xhci/hw_struct/regs.h	(revision 113fb4f7d41823fcc1ee75be3d89b3ccb0cb247e)
@@ -551,5 +551,5 @@
 
 typedef union {
-	char str [4];
+	char str[4] __attribute__((nonstring));
 	uint32_t packed;
 } xhci_sp_name_t;
Index: uspace/drv/bus/usb/xhci/rh.h
===================================================================
--- uspace/drv/bus/usb/xhci/rh.h	(revision 870841cf500de256e7549deb8adf082aa90a11ce)
+++ uspace/drv/bus/usb/xhci/rh.h	(revision 113fb4f7d41823fcc1ee75be3d89b3ccb0cb247e)
@@ -51,5 +51,5 @@
  */
 typedef struct xhci_port_speed {
-	char name [4];
+	char name[4] __attribute__((nonstring));
 	uint8_t major, minor;
 	uint64_t rx_bps, tx_bps;
