Home
last modified time | relevance | path

Searched full:ring (Results 1 – 25 of 1715) sorted by relevance

12345678910>>...69

/linux/drivers/gpu/drm/amd/amdgpu/
H A Damdgpu_ring.c40 * Most engines on the GPU are fed via ring buffers. Ring
46 * pointers are equal, the ring is idle. When the host
47 * writes commands to the ring buffer, it increments the
55 * @type: ring type for which to return the limit.
73 * amdgpu_ring_alloc - allocate space on the ring buffer
75 * @ring: amdgpu_ring structure holding ring information
76 * @ndw: number of dwords to allocate in the ring buffer
78 * Allocate @ndw dwords in the ring buffer (all asics).
81 int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned int ndw) in amdgpu_ring_alloc() argument
85 ndw = (ndw + ring->funcs->align_mask) & ~ring->funcs->align_mask; in amdgpu_ring_alloc()
[all …]
H A Damdgpu_ring_mux.c44 struct amdgpu_ring *ring) in amdgpu_ring_mux_sw_entry() argument
46 return ring->entry_index < mux->ring_entry_size ? in amdgpu_ring_mux_sw_entry()
47 &mux->ring_entry[ring->entry_index] : NULL; in amdgpu_ring_mux_sw_entry()
50 /* copy packages on sw ring range[begin, end) */
52 struct amdgpu_ring *ring, in amdgpu_ring_mux_copy_pkt_from_sw_ring() argument
58 start = s_start & ring->buf_mask; in amdgpu_ring_mux_copy_pkt_from_sw_ring()
59 end = s_end & ring->buf_mask; in amdgpu_ring_mux_copy_pkt_from_sw_ring()
62 DRM_ERROR("no more data copied from sw ring\n"); in amdgpu_ring_mux_copy_pkt_from_sw_ring()
66 amdgpu_ring_alloc(real_ring, (ring->ring_size >> 2) + end - start); in amdgpu_ring_mux_copy_pkt_from_sw_ring()
67 amdgpu_ring_write_multiple(real_ring, (void *)&ring->ring[start], in amdgpu_ring_mux_copy_pkt_from_sw_ring()
[all …]
H A Damdgpu_ib.c45 * command ring and the hw will fetch the commands from the IB
48 * put in IBs for execution by the requested ring.
103 * amdgpu_ib_schedule - schedule an IB (Indirect Buffer) on the ring
105 * @ring: ring index the IB is associated with
111 * Schedule an IB on the associated ring (all asics).
114 * On SI, there are two parallel engines fed from the primary ring,
121 * a CONST_IB), it will be put on the ring prior to the DE IB. Prior
124 int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned int num_ibs, in amdgpu_ib_schedule() argument
128 struct amdgpu_device *adev = ring->adev; in amdgpu_ib_schedule()
148 /* ring tests don't use a job */ in amdgpu_ib_schedule()
[all …]
/linux/drivers/gpu/drm/radeon/
H A Dradeon_ring.c39 * Most engines on the GPU are fed via ring buffers. Ring
45 * pointers are equal, the ring is idle. When the host
46 * writes commands to the ring buffer, it increments the
50 static void radeon_debugfs_ring_init(struct radeon_device *rdev, struct radeon_ring *ring);
53 * radeon_ring_supports_scratch_reg - check if the ring supports
57 * @ring: radeon_ring structure holding ring information
59 * Check if a specific ring supports writing to scratch registers (all asics).
60 * Returns true if the ring supports writing to scratch regs, false if not.
63 struct radeon_ring *ring) in radeon_ring_supports_scratch_reg() argument
65 switch (ring->idx) { in radeon_ring_supports_scratch_reg()
[all …]
H A Dr600_dma.c34 * to the 3D engine (ring buffer, IBs, etc.), but the
46 * @ring: radeon ring pointer
51 struct radeon_ring *ring) in r600_dma_get_rptr() argument
56 rptr = rdev->wb.wb[ring->rptr_offs/4]; in r600_dma_get_rptr()
67 * @ring: radeon ring pointer
72 struct radeon_ring *ring) in r600_dma_get_wptr() argument
81 * @ring: radeon ring pointer
86 struct radeon_ring *ring) in r600_dma_set_wptr() argument
88 WREG32(DMA_RB_WPTR, (ring->wptr << 2) & 0x3fffc); in r600_dma_set_wptr()
108 rdev->ring[R600_RING_TYPE_DMA_INDEX].ready = false; in r600_dma_stop()
[all …]
H A Dcik_sdma.c42 * and each one supports 1 ring buffer used for gfx
46 * (ring buffer, IBs, etc.), but sDMA has it's own
58 * @ring: radeon ring pointer
63 struct radeon_ring *ring) in cik_sdma_get_rptr() argument
68 rptr = rdev->wb.wb[ring->rptr_offs/4]; in cik_sdma_get_rptr()
70 if (ring->idx == R600_RING_TYPE_DMA_INDEX) in cik_sdma_get_rptr()
85 * @ring: radeon ring pointer
90 struct radeon_ring *ring) in cik_sdma_get_wptr() argument
94 if (ring->idx == R600_RING_TYPE_DMA_INDEX) in cik_sdma_get_wptr()
106 * @ring: radeon ring pointer
[all …]
/linux/include/linux/soc/ti/
H A Dk3-ringacc.h3 * K3 Ring Accelerator (RA) subsystem interface
18 * RA ring operational modes
20 * @K3_RINGACC_RING_MODE_RING: Exposed Ring mode for SW direct access
43 * RA ring element's sizes in bytes.
60 * enum k3_ring_cfg - RA ring configuration structure
62 * @size: Ring size, number of elements
63 * @elm_size: Ring element size
64 * @mode: Ring operational mode
65 * @flags: Ring configuration flags. Possible values:
66 * @K3_RINGACC_RING_SHARED: when set allows to request the same ring
[all …]
/linux/drivers/soc/ti/
H A Dk3-ringacc.c3 * TI K3 NAVSS Ring Accelerator subsystem driver
31 * @db: Ring Doorbell Register
33 * @occ: Ring Occupancy Register
34 * @indx: Ring Current Index Register
35 * @hwocc: Ring Hardware Occupancy Register
36 * @hwindx: Ring Hardware Current Index Register
57 * struct k3_ring_fifo_regs - The Ring Accelerator Queues Registers region
59 * @head_data: Ring Head Entry Data Registers
60 * @tail_data: Ring Tail Entry Data Registers
61 * @peek_head_data: Ring Peek Head Entry Data Regs
[all …]
/linux/drivers/bus/mhi/ep/
H A Dring.c10 size_t mhi_ep_ring_addr2offset(struct mhi_ep_ring *ring, u64 ptr) in mhi_ep_ring_addr2offset() argument
12 return (ptr - ring->rbase) / sizeof(struct mhi_ring_element); in mhi_ep_ring_addr2offset()
15 static u32 mhi_ep_ring_num_elems(struct mhi_ep_ring *ring) in mhi_ep_ring_num_elems() argument
19 memcpy_fromio(&rlen, (void __iomem *) &ring->ring_ctx->generic.rlen, sizeof(u64)); in mhi_ep_ring_num_elems()
24 void mhi_ep_ring_inc_index(struct mhi_ep_ring *ring) in mhi_ep_ring_inc_index() argument
26 ring->rd_offset = (ring->rd_offset + 1) % ring->ring_size; in mhi_ep_ring_inc_index()
29 static int __mhi_ep_cache_ring(struct mhi_ep_ring *ring, size_t end) in __mhi_ep_cache_ring() argument
31 struct mhi_ep_cntrl *mhi_cntrl = ring->mhi_cntrl; in __mhi_ep_cache_ring()
37 /* Don't proceed in the case of event ring. This happens during mhi_ep_ring_start(). */ in __mhi_ep_cache_ring()
38 if (ring->type == RING_TYPE_ER) in __mhi_ep_cache_ring()
[all …]
/linux/drivers/net/wireless/broadcom/b43legacy/
H A Ddma.c32 struct b43legacy_dmadesc32 *op32_idx2desc(struct b43legacy_dmaring *ring, in op32_idx2desc() argument
38 *meta = &(ring->meta[slot]); in op32_idx2desc()
39 desc = ring->descbase; in op32_idx2desc()
45 static void op32_fill_descriptor(struct b43legacy_dmaring *ring, in op32_fill_descriptor() argument
50 struct b43legacy_dmadesc32 *descbase = ring->descbase; in op32_fill_descriptor()
57 B43legacy_WARN_ON(!(slot >= 0 && slot < ring->nr_slots)); in op32_fill_descriptor()
62 addr |= ring->dev->dma.translation; in op32_fill_descriptor()
63 ctl = (bufsize - ring->frameoffset) in op32_fill_descriptor()
65 if (slot == ring->nr_slots - 1) in op32_fill_descriptor()
80 static void op32_poke_tx(struct b43legacy_dmaring *ring, int slot) in op32_poke_tx() argument
[all …]
/linux/drivers/net/wireless/broadcom/b43/
H A Ddma.c72 struct b43_dmadesc_generic *op32_idx2desc(struct b43_dmaring *ring, in op32_idx2desc() argument
78 *meta = &(ring->meta[slot]); in op32_idx2desc()
79 desc = ring->descbase; in op32_idx2desc()
85 static void op32_fill_descriptor(struct b43_dmaring *ring, in op32_fill_descriptor() argument
90 struct b43_dmadesc32 *descbase = ring->descbase; in op32_fill_descriptor()
97 B43_WARN_ON(!(slot >= 0 && slot < ring->nr_slots)); in op32_fill_descriptor()
99 addr = b43_dma_address(&ring->dev->dma, dmaaddr, B43_DMA_ADDR_LOW); in op32_fill_descriptor()
100 addrext = b43_dma_address(&ring->dev->dma, dmaaddr, B43_DMA_ADDR_EXT); in op32_fill_descriptor()
103 if (slot == ring->nr_slots - 1) in op32_fill_descriptor()
118 static void op32_poke_tx(struct b43_dmaring *ring, int slot) in op32_poke_tx() argument
[all …]
/linux/drivers/net/ethernet/apm/xgene/
H A Dxgene_enet_ring2.c12 static void xgene_enet_ring_init(struct xgene_enet_desc_ring *ring) in xgene_enet_ring_init() argument
14 u32 *ring_cfg = ring->state; in xgene_enet_ring_init()
15 u64 addr = ring->dma; in xgene_enet_ring_init()
17 if (xgene_enet_ring_owner(ring->id) == RING_OWNER_CPU) { in xgene_enet_ring_init()
18 ring_cfg[0] |= SET_VAL(X2_INTLINE, ring->id & RING_BUFNUM_MASK); in xgene_enet_ring_init()
27 ring_cfg[3] |= SET_VAL(RINGSIZE, ring->cfgsize) in xgene_enet_ring_init()
34 static void xgene_enet_ring_set_type(struct xgene_enet_desc_ring *ring) in xgene_enet_ring_set_type() argument
36 u32 *ring_cfg = ring->state; in xgene_enet_ring_set_type()
40 is_bufpool = xgene_enet_is_bufpool(ring->id); in xgene_enet_ring_set_type()
47 static void xgene_enet_ring_set_recombbuf(struct xgene_enet_desc_ring *ring) in xgene_enet_ring_set_recombbuf() argument
[all …]
/linux/drivers/crypto/intel/qat/qat_common/
H A Dadf_transport.c40 static int adf_reserve_ring(struct adf_etr_bank_data *bank, u32 ring) in adf_reserve_ring() argument
43 if (bank->ring_mask & (1 << ring)) { in adf_reserve_ring()
47 bank->ring_mask |= (1 << ring); in adf_reserve_ring()
52 static void adf_unreserve_ring(struct adf_etr_bank_data *bank, u32 ring) in adf_unreserve_ring() argument
55 bank->ring_mask &= ~(1 << ring); in adf_unreserve_ring()
59 static void adf_enable_ring_irq(struct adf_etr_bank_data *bank, u32 ring) in adf_enable_ring_irq() argument
64 bank->irq_mask |= (1 << ring); in adf_enable_ring_irq()
72 static void adf_disable_ring_irq(struct adf_etr_bank_data *bank, u32 ring) in adf_disable_ring_irq() argument
77 bank->irq_mask &= ~(1 << ring); in adf_disable_ring_irq()
83 bool adf_ring_nearly_full(struct adf_etr_ring_data *ring) in adf_ring_nearly_full() argument
[all …]
/linux/Documentation/devicetree/bindings/net/wireless/
H A Dqcom,ath11k.yaml115 - description: interrupt event for ring CE0
116 - description: interrupt event for ring CE1
117 - description: interrupt event for ring CE2
118 - description: interrupt event for ring CE3
119 - description: interrupt event for ring CE4
120 - description: interrupt event for ring CE5
121 - description: interrupt event for ring CE6
122 - description: interrupt event for ring CE7
123 - description: interrupt event for ring CE8
124 - description: interrupt event for ring CE9
[all …]
/linux/drivers/crypto/inside-secure/
H A Dsafexcel_ring.c21 /* Actual command descriptor ring */ in safexcel_init_ring_descriptors()
32 /* Command descriptor shadow ring for storing additional token data */ in safexcel_init_ring_descriptors()
78 struct safexcel_desc_ring *ring, in safexcel_ring_next_cwptr() argument
82 void *ptr = ring->write; in safexcel_ring_next_cwptr()
85 *atoken = ring->shwrite; in safexcel_ring_next_cwptr()
87 if ((ring->write == ring->read - ring->offset) || in safexcel_ring_next_cwptr()
88 (ring->read == ring->base && ring->write == ring->base_end)) in safexcel_ring_next_cwptr()
91 if (ring->write == ring->base_end) { in safexcel_ring_next_cwptr()
92 ring->write = ring->base; in safexcel_ring_next_cwptr()
93 ring->shwrite = ring->shbase; in safexcel_ring_next_cwptr()
[all …]
/linux/drivers/net/ethernet/mellanox/mlx4/
H A Den_tx.c56 struct mlx4_en_tx_ring *ring; in mlx4_en_create_tx_ring() local
60 ring = kzalloc_node(sizeof(*ring), GFP_KERNEL, node); in mlx4_en_create_tx_ring()
61 if (!ring) { in mlx4_en_create_tx_ring()
62 en_err(priv, "Failed allocating TX ring\n"); in mlx4_en_create_tx_ring()
66 ring->size = size; in mlx4_en_create_tx_ring()
67 ring->size_mask = size - 1; in mlx4_en_create_tx_ring()
68 ring->sp_stride = stride; in mlx4_en_create_tx_ring()
69 ring->full_size = ring->size - HEADROOM - MLX4_MAX_DESC_TXBBS; in mlx4_en_create_tx_ring()
72 ring->tx_info = kvmalloc_node(tmp, GFP_KERNEL, node); in mlx4_en_create_tx_ring()
73 if (!ring->tx_info) { in mlx4_en_create_tx_ring()
[all …]
/linux/drivers/gpu/drm/i915/gt/
H A Dintel_ring.c19 unsigned int intel_ring_update_space(struct intel_ring *ring) in intel_ring_update_space() argument
23 space = __intel_ring_space(ring->head, ring->emit, ring->size); in intel_ring_update_space()
25 ring->space = space; in intel_ring_update_space()
29 void __intel_ring_pin(struct intel_ring *ring) in __intel_ring_pin() argument
31 GEM_BUG_ON(!atomic_read(&ring->pin_count)); in __intel_ring_pin()
32 atomic_inc(&ring->pin_count); in __intel_ring_pin()
35 int intel_ring_pin(struct intel_ring *ring, struct i915_gem_ww_ctx *ww) in intel_ring_pin() argument
37 struct i915_vma *vma = ring->vma; in intel_ring_pin()
42 if (atomic_fetch_inc(&ring->pin_count)) in intel_ring_pin()
45 /* Ring wraparound at offset 0 sometimes hangs. No idea why. */ in intel_ring_pin()
[all …]
H A Dselftest_ring.c8 struct intel_ring *ring; in mock_ring() local
10 ring = kzalloc(sizeof(*ring) + sz, GFP_KERNEL); in mock_ring()
11 if (!ring) in mock_ring()
14 kref_init(&ring->ref); in mock_ring()
15 ring->size = sz; in mock_ring()
16 ring->wrap = BITS_PER_TYPE(ring->size) - ilog2(sz); in mock_ring()
17 ring->effective_size = sz; in mock_ring()
18 ring->vaddr = (void *)(ring + 1); in mock_ring()
19 atomic_set(&ring->pin_count, 1); in mock_ring()
21 intel_ring_update_space(ring); in mock_ring()
[all …]
/linux/tools/perf/pmu-events/arch/x86/ivytown/
H A Duncore-io.json17 …s into the IIO on either NCB or NCS are in use. Transactions from the BL ring going into the IIO …
27 …s into the IIO on either NCB or NCS are in use. Transactions from the BL ring going into the IIO …
37 …s into the IIO on either NCB or NCS are in use. Transactions from the BL ring going into the IIO …
57 …s into the IIO on either NCB or NCS are in use. Transactions from the BL ring going into the IIO …
67 …s into the IIO on either NCB or NCS are in use. Transactions from the BL ring going into the IIO …
77 …s into the IIO on either NCB or NCS are in use. Transactions from the BL ring going into the IIO …
82 "BriefDescription": "R2 AD Ring in Use; Counterclockwise",
87ring is being used at this ring stop. This includes when packets are passing by and when packets …
92 "BriefDescription": "R2 AD Ring in Use; Counterclockwise and Even on VRing 0",
97ring is being used at this ring stop. This includes when packets are passing by and when packets …
[all …]
/linux/drivers/net/wireless/ath/ath12k/
H A Ddbring.c12 struct ath12k_dbring *ring, in ath12k_dbring_bufs_replenish() argument
24 srng = &ab->hal.srng_list[ring->refill_srng.ring_id]; in ath12k_dbring_bufs_replenish()
31 ptr_aligned = PTR_ALIGN(ptr_unaligned, ring->buf_align); in ath12k_dbring_bufs_replenish()
32 paddr = dma_map_single(ab->dev, ptr_aligned, ring->buf_sz, in ath12k_dbring_bufs_replenish()
39 spin_lock_bh(&ring->idr_lock); in ath12k_dbring_bufs_replenish()
40 buf_id = idr_alloc(&ring->bufs_idr, buff, 0, ring->bufs_max, gfp); in ath12k_dbring_bufs_replenish()
41 spin_unlock_bh(&ring->idr_lock); in ath12k_dbring_bufs_replenish()
65 spin_lock_bh(&ring->idr_lock); in ath12k_dbring_bufs_replenish()
66 idr_remove(&ring->bufs_idr, buf_id); in ath12k_dbring_bufs_replenish()
67 spin_unlock_bh(&ring->idr_lock); in ath12k_dbring_bufs_replenish()
[all …]
/linux/drivers/net/wireless/ath/ath11k/
H A Ddbring.c41 struct ath11k_dbring *ring, in ath11k_dbring_bufs_replenish() argument
53 srng = &ab->hal.srng_list[ring->refill_srng.ring_id]; in ath11k_dbring_bufs_replenish()
60 ptr_aligned = PTR_ALIGN(ptr_unaligned, ring->buf_align); in ath11k_dbring_bufs_replenish()
61 ath11k_dbring_fill_magic_value(ar, ptr_aligned, ring->buf_sz); in ath11k_dbring_bufs_replenish()
62 paddr = dma_map_single(ab->dev, ptr_aligned, ring->buf_sz, in ath11k_dbring_bufs_replenish()
69 spin_lock_bh(&ring->idr_lock); in ath11k_dbring_bufs_replenish()
70 buf_id = idr_alloc(&ring->bufs_idr, buff, 0, ring->bufs_max, GFP_ATOMIC); in ath11k_dbring_bufs_replenish()
71 spin_unlock_bh(&ring->idr_lock); in ath11k_dbring_bufs_replenish()
96 spin_lock_bh(&ring->idr_lock); in ath11k_dbring_bufs_replenish()
97 idr_remove(&ring->bufs_idr, buf_id); in ath11k_dbring_bufs_replenish()
[all …]
/linux/tools/testing/selftests/net/
H A Dpsock_tpacket.c66 struct ring { struct
71 void (*walk)(int sock, struct ring *ring); argument
220 static void walk_v1_v2_rx(int sock, struct ring *ring) in walk_v1_v2_rx() argument
227 bug_on(ring->type != PACKET_RX_RING); in walk_v1_v2_rx()
239 while (__v1_v2_rx_kernel_ready(ring->rd[frame_num].iov_base, in walk_v1_v2_rx()
240 ring->version)) { in walk_v1_v2_rx()
241 ppd.raw = ring->rd[frame_num].iov_base; in walk_v1_v2_rx()
243 switch (ring in walk_v1_v2_rx()
72 versionring global() argument
73 __anonf0a4eb61010aring global() argument
354 get_next_frame(struct ring * ring,int n) get_next_frame() argument
369 walk_tx(int sock,struct ring * ring) walk_tx() argument
500 walk_v1_v2(int sock,struct ring * ring) walk_v1_v2() argument
581 walk_v3_rx(int sock,struct ring * ring) walk_v3_rx() argument
622 walk_v3(int sock,struct ring * ring) walk_v3() argument
630 __v1_v2_fill(struct ring * ring,unsigned int blocks) __v1_v2_fill() argument
646 __v3_fill(struct ring * ring,unsigned int blocks,int type) __v3_fill() argument
667 setup_ring(int sock,struct ring * ring,int version,int type) setup_ring() argument
708 mmap_ring(int sock,struct ring * ring) mmap_ring() argument
726 bind_ring(int sock,struct ring * ring) bind_ring() argument
746 walk_ring(int sock,struct ring * ring) walk_ring() argument
751 unmap_ring(int sock,struct ring * ring) unmap_ring() argument
805 struct ring ring; test_tpacket() local
[all...]
/linux/net/rds/
H A Dib_ring.c66 void rds_ib_ring_init(struct rds_ib_work_ring *ring, u32 nr) in rds_ib_ring_init() argument
68 memset(ring, 0, sizeof(*ring)); in rds_ib_ring_init()
69 ring->w_nr = nr; in rds_ib_ring_init()
70 rdsdebug("ring %p nr %u\n", ring, ring->w_nr); in rds_ib_ring_init()
73 static inline u32 __rds_ib_ring_used(struct rds_ib_work_ring *ring) in __rds_ib_ring_used() argument
78 diff = ring->w_alloc_ctr - (u32) atomic_read(&ring->w_free_ctr); in __rds_ib_ring_used()
79 BUG_ON(diff > ring->w_nr); in __rds_ib_ring_used()
84 void rds_ib_ring_resize(struct rds_ib_work_ring *ring, u32 nr) in rds_ib_ring_resize() argument
88 BUG_ON(__rds_ib_ring_used(ring)); in rds_ib_ring_resize()
89 ring->w_nr = nr; in rds_ib_ring_resize()
[all …]
/linux/drivers/net/ethernet/marvell/octeon_ep/
H A Doctep_regs_cnxk_pf.h32 /* ################# Offsets of RING, EPF, MAC ######################### */
62 /* ##### RING IN (Into device from PCI: Tx Ring) REGISTERS #### */
73 #define CNXK_SDP_R_IN_CONTROL(ring) \ argument
74 (CNXK_SDP_R_IN_CONTROL_START + ((ring) * CNXK_RING_OFFSET))
76 #define CNXK_SDP_R_IN_ENABLE(ring) \ argument
77 (CNXK_SDP_R_IN_ENABLE_START + ((ring) * CNXK_RING_OFFSET))
79 #define CNXK_SDP_R_IN_INSTR_BADDR(ring) \ argument
80 (CNXK_SDP_R_IN_INSTR_BADDR_START + ((ring) * CNXK_RING_OFFSET))
82 #define CNXK_SDP_R_IN_INSTR_RSIZE(ring) \ argument
83 (CNXK_SDP_R_IN_INSTR_RSIZE_START + ((ring) * CNXK_RING_OFFSET))
[all …]
/linux/drivers/mailbox/
H A Dbcm-flexrm-mailbox.c8 * extension to Broadcom FlexRM ring manager. The FlexRM ring
13 * rings where each mailbox channel represents a separate FlexRM ring.
66 /* Per-Ring register offsets */
128 /* ====== FlexRM ring descriptor defines ===== */
292 /* ====== FlexRM ring descriptor helper routines ===== */
924 struct flexrm_ring *ring; in flexrm_write_config_in_seqfile() local
927 "Ring#", "State", "BD_Addr", "BD_Size", in flexrm_write_config_in_seqfile()
931 ring = &mbox->rings[i]; in flexrm_write_config_in_seqfile()
932 if (readl(ring->regs + RING_CONTROL) & in flexrm_write_config_in_seqfile()
939 ring->num, state, in flexrm_write_config_in_seqfile()
[all …]

12345678910>>...69