Skip to content
Questions
A prisоner's dilemmа cаn be described аs a situatiоn in which
Show Answer
Hide Answer
93 struct usb_kbd { 94 struct input_dev *dev; 95 struct usb_device *usbdev; 96 unsigned chаr оld[8]; 97 struct urb *irq, *led; 98 unsigned chаr newleds; 99 chаr name[128];100 char phys[64];101 102 unsigned char *new;103 struct usb_ctrlrequest *cr;104 unsigned char *leds;105 dma_addr_t new_dma;106 dma_addr_t leds_dma;107 108 spinlоck_t leds_lоck;109 bool led_urb_submitted;110 111 };112 113 static void usb_kbd_irq(struct urb *urb)114 {115 struct usb_kbd *kbd = urb->context;116 int i;117 118 switch (urb->status) {119 case 0: /* success */120 break;121 case -ECONNRESET: /* unlink */122 case -ENOENT:123 case -ESHUTDOWN:124 return;125 /* -EPIPE: should clear the halt */126 default: /* error */127 goto resubmit;128 }129 130 for (i = 0; i < 8; i++)131 input_report_key(kbd->dev, usb_kbd_keycode[i + 224], (kbd->new[0] >> i) & 1);132 133 for (i = 2; i < 8; i++) {134 135 if (kbd->old[i] > 3 && memscan(kbd->new + 2, kbd->old[i], 6) == kbd->new + 8) {136 if (usb_kbd_keycode[kbd->old[i]])137 input_report_key(kbd->dev, usb_kbd_keycode[kbd->old[i]], 0);138 else139 hid_info(urb->dev,140 "Unknown key (scancode %#x) released.n",141 kbd->old[i]);142 }143 144 if (kbd->new[i] > 3 && memscan(kbd->old + 2, kbd->new[i], 6) == kbd->old + 8) {145 if (usb_kbd_keycode[kbd->new[i]])146 input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);147 else148 hid_info(urb->dev,149 "Unknown key (scancode %#x) pressed.n",150 kbd->new[i]);151 }152 }153 154 input_sync(kbd->dev);155 156 memcpy(kbd->old, kbd->new, 8);157 158 resubmit:159 i = usb_submit_urb (urb, GFP_ATOMIC);160 if (i)161 hid_err(urb->dev, "can't resubmit intr, %s-%s/input0, status %d",162 kbd->usbdev->bus->bus_name,163 kbd->usbdev->devpath, i);164 }165 166 static int usb_kbd_event(struct input_dev *dev, unsigned int type,167 unsigned int code, int value)168 {169 unsigned long flags;170 struct usb_kbd *kbd = input_get_drvdata(dev);171 172 if (type != EV_LED)173 return -1;174 175 spin_lock_irqsave(&kbd->leds_lock, flags);176 kbd->newleds = (!!test_bit(LED_KANA, dev->led) led) led) led) led));179 180 if (kbd->led_urb_submitted){181 spin_unlock_irqrestore(&kbd->leds_lock, flags);182 return 0;183 }184 185 if (*(kbd->leds) == kbd->newleds){186 spin_unlock_irqrestore(&kbd->leds_lock, flags);187 return 0;188 }189 190 *(kbd->leds) = kbd->newleds;191 192 kbd->led->dev = kbd->usbdev;193 if (usb_submit_urb(kbd->led, GFP_ATOMIC))194 pr_err("usb_submit_urb(leds) failedn");195 else196 kbd->led_urb_submitted = true;197 198 spin_unlock_irqrestore(&kbd->leds_lock, flags);199 200 return 0;201 }202 203 static void usb_kbd_led(struct urb *urb)204 {205 unsigned long flags;206 struct usb_kbd *kbd = urb->context;207 208 if (urb->status)209 hid_warn(urb->dev, "led urb status %d receivedn",210 urb->status);211 212 spin_lock_irqsave(&kbd->leds_lock, flags);213 214 if (*(kbd->leds) == kbd->newleds){215 kbd->led_urb_submitted = false;216 spin_unlock_irqrestore(&kbd->leds_lock, flags);217 return;218 }219 220 *(kbd->leds) = kbd->newleds;221 222 kbd->led->dev = kbd->usbdev;223 if (usb_submit_urb(kbd->led, GFP_ATOMIC)){224 hid_err(urb->dev, "usb_submit_urb(leds) failedn");225 kbd->led_urb_submitted = false;226 }227 spin_unlock_irqrestore(&kbd->leds_lock, flags);228 229 }230 231 static int usb_kbd_open(struct input_dev *dev)232 {233 struct usb_kbd *kbd = input_get_drvdata(dev);234 235 kbd->irq->dev = kbd->usbdev;236 if (usb_submit_urb(kbd->irq, GFP_KERNEL))237 return -EIO;238 239 return 0;240 }241 242 static void usb_kbd_close(struct input_dev *dev)243 {244 struct usb_kbd *kbd = input_get_drvdata(dev);245 246 usb_kill_urb(kbd->irq);247 }248 249 static int usb_kbd_alloc_mem(struct usb_device *dev, struct usb_kbd *kbd)250 {251 if (!(kbd->irq = usb_alloc_urb(0, GFP_KERNEL)))252 return -1;253 if (!(kbd->led = usb_alloc_urb(0, GFP_KERNEL)))254 return -1;255 if (!(kbd->new = usb_alloc_coherent(dev, 8, GFP_ATOMIC, &kbd->new_dma)))256 return -1;257 if (!(kbd->cr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL)))258 return -1;259 if (!(kbd->leds = usb_alloc_coherent(dev, 1, GFP_ATOMIC, &kbd->leds_dma)))260 return -1;261 262 return 0;263 }
Show Answer
Hide Answer
Post navigation