Loading drivers/staging/frontier/alphatrack.c +0 −2 Original line number Diff line number Diff line Loading @@ -46,8 +46,6 @@ #include <linux/usb.h> #include <linux/poll.h> #include "surface_sysfs.h" #include "alphatrack.h" #define VENDOR_ID 0x165b Loading drivers/staging/frontier/surface_sysfs.hdeleted 100644 → 0 +0 −100 Original line number Diff line number Diff line /* If you are going to abuse the preprocessor, why not ABUSE the preprocessor? I stuck this header in a separate file so I don't have to look at it */ // FIXME Need locking or atomic ops #define show_set_mbit(dname,value,bit) \ static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int temp = (1 && (t->value & (1 << bit))); \ return sprintf(buf, "%d\n", temp); \ } \ static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ if(temp > 0) { long b = 1 << bit; t->value |= b; } \ else { long b = ~(1 << bit); t->value &= b ; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); #define show_set_ebit(dname,enumname,value,bit) \ static ssize_t show_##bit(struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ enum enumname l = bit; \ int temp = t->value & (1 << l); \ return sprintf(buf, "%d\n", temp); \ } \ static ssize_t set_##bit(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ enum enumname l = bit;\ long b = 1 << l; \ if(temp > 0) { t->value |= b; } \ else { t->value &= ~b ; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); // FIXME FOR CORRECTLY SETTING HEX from a string #define show_set_mcmd(dname,value) \ static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int count = 0;\ int i; \ for (i = 0,i<sizeof(dname); i++) count += snprintf(buf, "%02x",t->dname[i]); \ return(count);\ } \ static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ t->value = temp; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); #define show_set_mint(dname,value) \ static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ return sprintf(buf, "%d\n", t->value); \ } \ static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ t->value = temp; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); #define show_set_mchar(dname,value) \ static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ return sprintf(buf, "%c\n", t->value); \ } \ static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ t->value = temp; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); drivers/staging/frontier/tranzport.c +10 −118 Original line number Diff line number Diff line Loading @@ -51,7 +51,7 @@ #ifdef CONFIG_USB_DYNAMIC_MINORS #define USB_TRANZPORT_MINOR_BASE 0 #else /* FIXME 176 - is the ldusb driver's minor - apply for a minor soon */ #else /* FIXME 177- is the another driver's minor - apply for a minor soon */ #define USB_TRANZPORT_MINOR_BASE 177 #endif Loading @@ -62,7 +62,7 @@ static struct usb_device_id usb_tranzport_table[] = { }; MODULE_DEVICE_TABLE(usb, usb_tranzport_table); MODULE_VERSION("0.34"); MODULE_VERSION("0.35"); MODULE_AUTHOR("Mike Taht <m@taht.net>"); MODULE_DESCRIPTION("Tranzport USB Driver"); MODULE_LICENSE("GPL"); Loading Loading @@ -121,16 +121,6 @@ struct tranzport_cmd { unsigned char cmd[8]; }; enum LightID { LightRecord = 0, LightTrackrec, LightTrackmute, LightTracksolo, LightAnysolo, LightLoop, LightPunch }; /* Structure to hold all of our device specific stuff */ struct usb_tranzport { Loading @@ -156,19 +146,11 @@ struct usb_tranzport { size_t interrupt_out_endpoint_size; int interrupt_out_busy; /* Sysfs and translation support */ /* Sysfs support */ int event; /* alternate interface to events */ int wheel; /* - for negative, 0 for none, + for positive */ unsigned char dump_state; /* 0 if disabled 1 if enabled */ unsigned char enable; /* 0 if disabled 1 if enabled */ unsigned char offline; /* if the device is out of range or asleep */ unsigned char compress_wheel; /* flag to compress wheel events */ unsigned char light; /* 7 bits used */ unsigned char last_cmd[8]; unsigned char last_input[8]; unsigned char screen[40]; /* We'll also have cells */ }; /* prevent races between open() and disconnect() */ Loading @@ -193,40 +175,7 @@ static void usb_tranzport_abort_transfers(struct usb_tranzport *dev) usb_kill_urb(dev->interrupt_out_urb); } /* FIXME ~light not good enough or correct - need atomic set_bit */ #define show_set_light(value) \ static ssize_t show_##value( \ struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_tranzport *t = usb_get_intfdata(intf); \ enum LightID light = value; \ int temp = (1 && (t->light & (1 << light))); \ return sprintf(buf, "%d\n", temp); \ } \ static ssize_t set_##value( \ struct device *dev, struct device_attribute *attr, \ const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_tranzport *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ enum LightID light = (temp << value) & (t->light << value); \ t->light = (t->light & ~light) ; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); show_set_light(LightRecord); show_set_light(LightTrackrec); show_set_light(LightTrackmute); show_set_light(LightTracksolo); show_set_light(LightAnysolo); show_set_light(LightLoop); show_set_light(LightPunch); #define show_set_int(value) \ #define show_int(value) \ static ssize_t show_##value(struct device *dev, \ struct device_attribute *attr, char *buf) \ { \ Loading @@ -234,32 +183,14 @@ show_set_light(LightPunch); struct usb_tranzport *t = usb_get_intfdata(intf); \ return sprintf(buf, "%d\n", t->value); \ } \ static ssize_t set_##value(struct device *dev, \ struct device_attribute *attr, \ const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_tranzport *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ t->value = temp; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); show_set_int(enable); show_set_int(offline); show_set_int(compress_wheel); show_set_int(dump_state); show_set_int(wheel); show_set_int(event); static DEVICE_ATTR(value, S_IRUGO, show_##value, NULL); #define show_set_cmd(value) \ #define show_set_int(value) \ static ssize_t show_##value(struct device *dev, \ struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_tranzport *t = usb_get_intfdata(intf); \ \ return sprintf(buf, "%d\n", t->value); \ } \ static ssize_t set_##value(struct device *dev, \ Loading @@ -269,34 +200,25 @@ show_set_int(event); struct usb_interface *intf = to_usb_interface(dev); \ struct usb_tranzport *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ \ t->value = temp; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); show_int(enable); show_int(offline); show_set_int(compress_wheel); /** * usb_tranzport_delete */ static void usb_tranzport_delete(struct usb_tranzport *dev) { usb_tranzport_abort_transfers(dev); /* This is just too twisted to be correct */ if (dev->intf != NULL) { device_remove_file(&dev->intf->dev, &dev_attr_LightRecord); device_remove_file(&dev->intf->dev, &dev_attr_LightTrackrec); device_remove_file(&dev->intf->dev, &dev_attr_LightTrackmute); device_remove_file(&dev->intf->dev, &dev_attr_LightTracksolo); device_remove_file(&dev->intf->dev, &dev_attr_LightTrackmute); device_remove_file(&dev->intf->dev, &dev_attr_LightAnysolo); device_remove_file(&dev->intf->dev, &dev_attr_LightLoop); device_remove_file(&dev->intf->dev, &dev_attr_LightPunch); device_remove_file(&dev->intf->dev, &dev_attr_wheel); device_remove_file(&dev->intf->dev, &dev_attr_enable); device_remove_file(&dev->intf->dev, &dev_attr_event); device_remove_file(&dev->intf->dev, &dev_attr_offline); device_remove_file(&dev->intf->dev, &dev_attr_compress_wheel); device_remove_file(&dev->intf->dev, &dev_attr_dump_state); } /* free data structures */ Loading Loading @@ -983,36 +905,6 @@ static int usb_tranzport_probe(struct usb_interface *intf, goto error; } retval = device_create_file(&intf->dev, &dev_attr_LightRecord); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_LightTrackrec); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_LightTrackmute); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_LightTracksolo); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_LightAnysolo); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_LightLoop); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_LightPunch); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_wheel); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_event); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_dump_state); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_compress_wheel); if (retval) goto error; Loading Loading
drivers/staging/frontier/alphatrack.c +0 −2 Original line number Diff line number Diff line Loading @@ -46,8 +46,6 @@ #include <linux/usb.h> #include <linux/poll.h> #include "surface_sysfs.h" #include "alphatrack.h" #define VENDOR_ID 0x165b Loading
drivers/staging/frontier/surface_sysfs.hdeleted 100644 → 0 +0 −100 Original line number Diff line number Diff line /* If you are going to abuse the preprocessor, why not ABUSE the preprocessor? I stuck this header in a separate file so I don't have to look at it */ // FIXME Need locking or atomic ops #define show_set_mbit(dname,value,bit) \ static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int temp = (1 && (t->value & (1 << bit))); \ return sprintf(buf, "%d\n", temp); \ } \ static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ if(temp > 0) { long b = 1 << bit; t->value |= b; } \ else { long b = ~(1 << bit); t->value &= b ; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); #define show_set_ebit(dname,enumname,value,bit) \ static ssize_t show_##bit(struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ enum enumname l = bit; \ int temp = t->value & (1 << l); \ return sprintf(buf, "%d\n", temp); \ } \ static ssize_t set_##bit(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ enum enumname l = bit;\ long b = 1 << l; \ if(temp > 0) { t->value |= b; } \ else { t->value &= ~b ; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); // FIXME FOR CORRECTLY SETTING HEX from a string #define show_set_mcmd(dname,value) \ static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int count = 0;\ int i; \ for (i = 0,i<sizeof(dname); i++) count += snprintf(buf, "%02x",t->dname[i]); \ return(count);\ } \ static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ t->value = temp; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); #define show_set_mint(dname,value) \ static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ return sprintf(buf, "%d\n", t->value); \ } \ static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ t->value = temp; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); #define show_set_mchar(dname,value) \ static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ return sprintf(buf, "%c\n", t->value); \ } \ static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_##dname *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ t->value = temp; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value);
drivers/staging/frontier/tranzport.c +10 −118 Original line number Diff line number Diff line Loading @@ -51,7 +51,7 @@ #ifdef CONFIG_USB_DYNAMIC_MINORS #define USB_TRANZPORT_MINOR_BASE 0 #else /* FIXME 176 - is the ldusb driver's minor - apply for a minor soon */ #else /* FIXME 177- is the another driver's minor - apply for a minor soon */ #define USB_TRANZPORT_MINOR_BASE 177 #endif Loading @@ -62,7 +62,7 @@ static struct usb_device_id usb_tranzport_table[] = { }; MODULE_DEVICE_TABLE(usb, usb_tranzport_table); MODULE_VERSION("0.34"); MODULE_VERSION("0.35"); MODULE_AUTHOR("Mike Taht <m@taht.net>"); MODULE_DESCRIPTION("Tranzport USB Driver"); MODULE_LICENSE("GPL"); Loading Loading @@ -121,16 +121,6 @@ struct tranzport_cmd { unsigned char cmd[8]; }; enum LightID { LightRecord = 0, LightTrackrec, LightTrackmute, LightTracksolo, LightAnysolo, LightLoop, LightPunch }; /* Structure to hold all of our device specific stuff */ struct usb_tranzport { Loading @@ -156,19 +146,11 @@ struct usb_tranzport { size_t interrupt_out_endpoint_size; int interrupt_out_busy; /* Sysfs and translation support */ /* Sysfs support */ int event; /* alternate interface to events */ int wheel; /* - for negative, 0 for none, + for positive */ unsigned char dump_state; /* 0 if disabled 1 if enabled */ unsigned char enable; /* 0 if disabled 1 if enabled */ unsigned char offline; /* if the device is out of range or asleep */ unsigned char compress_wheel; /* flag to compress wheel events */ unsigned char light; /* 7 bits used */ unsigned char last_cmd[8]; unsigned char last_input[8]; unsigned char screen[40]; /* We'll also have cells */ }; /* prevent races between open() and disconnect() */ Loading @@ -193,40 +175,7 @@ static void usb_tranzport_abort_transfers(struct usb_tranzport *dev) usb_kill_urb(dev->interrupt_out_urb); } /* FIXME ~light not good enough or correct - need atomic set_bit */ #define show_set_light(value) \ static ssize_t show_##value( \ struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_tranzport *t = usb_get_intfdata(intf); \ enum LightID light = value; \ int temp = (1 && (t->light & (1 << light))); \ return sprintf(buf, "%d\n", temp); \ } \ static ssize_t set_##value( \ struct device *dev, struct device_attribute *attr, \ const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_tranzport *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ enum LightID light = (temp << value) & (t->light << value); \ t->light = (t->light & ~light) ; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); show_set_light(LightRecord); show_set_light(LightTrackrec); show_set_light(LightTrackmute); show_set_light(LightTracksolo); show_set_light(LightAnysolo); show_set_light(LightLoop); show_set_light(LightPunch); #define show_set_int(value) \ #define show_int(value) \ static ssize_t show_##value(struct device *dev, \ struct device_attribute *attr, char *buf) \ { \ Loading @@ -234,32 +183,14 @@ show_set_light(LightPunch); struct usb_tranzport *t = usb_get_intfdata(intf); \ return sprintf(buf, "%d\n", t->value); \ } \ static ssize_t set_##value(struct device *dev, \ struct device_attribute *attr, \ const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_tranzport *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ t->value = temp; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); show_set_int(enable); show_set_int(offline); show_set_int(compress_wheel); show_set_int(dump_state); show_set_int(wheel); show_set_int(event); static DEVICE_ATTR(value, S_IRUGO, show_##value, NULL); #define show_set_cmd(value) \ #define show_set_int(value) \ static ssize_t show_##value(struct device *dev, \ struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ struct usb_tranzport *t = usb_get_intfdata(intf); \ \ return sprintf(buf, "%d\n", t->value); \ } \ static ssize_t set_##value(struct device *dev, \ Loading @@ -269,34 +200,25 @@ show_set_int(event); struct usb_interface *intf = to_usb_interface(dev); \ struct usb_tranzport *t = usb_get_intfdata(intf); \ int temp = simple_strtoul(buf, NULL, 10); \ \ t->value = temp; \ return count; \ } \ static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); show_int(enable); show_int(offline); show_set_int(compress_wheel); /** * usb_tranzport_delete */ static void usb_tranzport_delete(struct usb_tranzport *dev) { usb_tranzport_abort_transfers(dev); /* This is just too twisted to be correct */ if (dev->intf != NULL) { device_remove_file(&dev->intf->dev, &dev_attr_LightRecord); device_remove_file(&dev->intf->dev, &dev_attr_LightTrackrec); device_remove_file(&dev->intf->dev, &dev_attr_LightTrackmute); device_remove_file(&dev->intf->dev, &dev_attr_LightTracksolo); device_remove_file(&dev->intf->dev, &dev_attr_LightTrackmute); device_remove_file(&dev->intf->dev, &dev_attr_LightAnysolo); device_remove_file(&dev->intf->dev, &dev_attr_LightLoop); device_remove_file(&dev->intf->dev, &dev_attr_LightPunch); device_remove_file(&dev->intf->dev, &dev_attr_wheel); device_remove_file(&dev->intf->dev, &dev_attr_enable); device_remove_file(&dev->intf->dev, &dev_attr_event); device_remove_file(&dev->intf->dev, &dev_attr_offline); device_remove_file(&dev->intf->dev, &dev_attr_compress_wheel); device_remove_file(&dev->intf->dev, &dev_attr_dump_state); } /* free data structures */ Loading Loading @@ -983,36 +905,6 @@ static int usb_tranzport_probe(struct usb_interface *intf, goto error; } retval = device_create_file(&intf->dev, &dev_attr_LightRecord); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_LightTrackrec); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_LightTrackmute); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_LightTracksolo); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_LightAnysolo); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_LightLoop); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_LightPunch); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_wheel); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_event); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_dump_state); if (retval) goto error; retval = device_create_file(&intf->dev, &dev_attr_compress_wheel); if (retval) goto error; Loading