| 287 | } |
| 288 | |
| 289 | void USB::DoPacketState(USBPacket* p, StateWrapper& sw, const std::array<bool, 2>& valid_devices) |
| 290 | { |
| 291 | if (!sw.DoMarker("USBPacket")) |
| 292 | return; |
| 293 | |
| 294 | s32 dev_index = -1; |
| 295 | s32 ep_index = -1; |
| 296 | bool queued = false; |
| 297 | if (sw.IsWriting()) |
| 298 | { |
| 299 | USBEndpoint* ep = p->ep; |
| 300 | if (ep) |
| 301 | { |
| 302 | for (u32 i = 0; i < NUM_PORTS; i++) |
| 303 | { |
| 304 | USBDevice* dev = s_usb_device[i]; |
| 305 | if (valid_devices[i] && ep->dev == dev) |
| 306 | { |
| 307 | dev_index = static_cast<s32>(i); |
| 308 | if (ep == &dev->ep_ctl) |
| 309 | ep_index = 0; |
| 310 | else if (ep >= &dev->ep_in[0] && ep <= &dev->ep_in[USB_MAX_ENDPOINTS - 1]) |
| 311 | ep_index = static_cast<s32>(ep - &dev->ep_in[0]) + 1; |
| 312 | else if (ep >= &dev->ep_out[0] && ep <= &dev->ep_out[USB_MAX_ENDPOINTS - 1]) |
| 313 | ep_index = static_cast<s32>(ep - &dev->ep_out[0]) + 1 + USB_MAX_ENDPOINTS; |
| 314 | |
| 315 | USBPacket* pp; |
| 316 | QTAILQ_FOREACH(pp, &ep->queue, queue) |
| 317 | { |
| 318 | if (pp == p) |
| 319 | queued = true; |
| 320 | } |
| 321 | |
| 322 | break; |
| 323 | } |
| 324 | } |
| 325 | if (dev_index < 0 || ep_index < 0) |
| 326 | Console.Error("Failed to save USB packet from unknown endpoint"); |
| 327 | } |
| 328 | } |
| 329 | |
| 330 | sw.Do(&dev_index); |
| 331 | sw.Do(&ep_index); |
| 332 | sw.Do(&p->buffer_size); |
| 333 | sw.Do(&queued); |
| 334 | |
| 335 | sw.Do(&p->pid); |
| 336 | sw.Do(&p->id); |
| 337 | sw.Do(&p->stream); |
| 338 | sw.Do(&p->parameter); |
| 339 | sw.Do(&p->short_not_ok); |
| 340 | sw.Do(&p->int_req); |
| 341 | sw.Do(&p->status); |
| 342 | sw.Do(&p->actual_length); |
| 343 | sw.Do(&p->state); |
| 344 | |
| 345 | if (sw.IsReading()) |
| 346 | { |